日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

9.2.4 .net core 通过ViewComponent封装控件

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 9.2.4 .net core 通过ViewComponent封装控件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們在.net core中還使用了ViewComponent方式生成控件。ViewComponent也是asp.net core的新特性,是對頁面部分的渲染,以前PartialView的功能,可以使用ViewComponent來實現。

View Component包含2個部分,一個是類(繼承于ViewComponent),和它返回的結果Razor視圖(和普通的View視圖一樣)。

?

我們還是來看一下以側邊菜單控件為例子,怎么創建一個ViewComponent。側邊菜單控件如下圖:

控件的主要邏輯是按照用戶和應用程序代碼,獲取所有已經按照父子結構組織的菜單,傳送到頁面展示。

上面已經提到,View Component包含2個部分,一個是類,這個類也繼承于ViewComponent類。子控件最主要的是重寫ViewComponent類的Invoke/InvokeAsync方法:

?

1 public class SideMenuViewComponent : ViewComponent 2 { 3 private IMenuAppService service; 4 public SideMenuViewComponent(IMenuAppService service) 5 { 6 this.service = service; 7 } 8 9 public IViewComponentResult Invoke(string appCode, UserInfo userInfo) 10 { 11 IEnumerable<MenuDto> menuItems = this.service.GetHierarchy(appCode, userInfo); 12 13 return View("SideMenu", menuItems); 14 } 15 }

?

?

再來看ViewComponent的第二部分,就是Razor視圖,這里是SideMenu.cshtml:

?

1 @using MicroStrutLibrary.Presentation.Web.Controls 2 @using MicroStrutLibrary.AppService.Portal 3 @using Microsoft.AspNetCore.Html 4 5 @model IEnumerable<MenuDto> 6 @{ 7 var controlId = System.Guid.NewGuid().ToString("N"); 8 } 9 10 @functions 11 { 12 public IHtmlContent RenderChildren(IEnumerable<MenuDto> menuItems) 13 { 14 string result = "<ul class=\"submenu\" style=\"display: none;\">"; 15 16 foreach (MenuDto itemInfo in menuItems) 17 { 18 var url = Url.Content(string.IsNullOrWhiteSpace(itemInfo.Url) ? "#" : itemInfo.Url); 19 var icon = string.IsNullOrWhiteSpace(itemInfo.IconClass) ? "fa fa-list-ul" : itemInfo.IconClass; 20 var leaf = (itemInfo.IsLeaf && (itemInfo.Children == null || itemInfo.Children.Count() < 1)); 21 22 result += "<li>"; 23 result += $"<a href=\"{Html.Raw(url)}\" target=\"{itemInfo.Target}\" title=\"{itemInfo.MenuDesc}\" data-feature=\"{itemInfo.WinFeature}\" data-leaf=\"{leaf.ToString().ToLower()}\"><i class=\"${Html.Raw(icon)}\"></i><span>{itemInfo.MenuName}</span></a>"; 24 if (!leaf) 25 { 26 result += RenderChildren(itemInfo.Children).ToString(); 27 } 28 } 29 30 result += "</ul>"; 31 return new HtmlString(result); 32 } 33 } 34 <div id="@(controlId)" class="jquery-accordion-menu red"> 35 <div class="jquery-accordion-menu-header"> 36 </div> 37 <ul> 38 @foreach (MenuDto itemInfo in Model) 39 { 40 var url = Url.Content(string.IsNullOrWhiteSpace(itemInfo.Url) ? "#" : itemInfo.Url); 41 var icon = string.IsNullOrWhiteSpace(itemInfo.IconClass) ? "fa fa-list-ul" : itemInfo.IconClass; 42 var leaf = (itemInfo.IsLeaf && (itemInfo.Children == null || itemInfo.Children.Count() < 1)); 43 44 <li> 45 <a href="@Html.Raw(url)" target="@itemInfo.Target" title="@itemInfo.MenuDesc" data-feature="@itemInfo.WinFeature" data-leaf="@(leaf.ToString().ToLower())"> 46 <i class="@Html.Raw(icon)"></i> 47 <span>@itemInfo.MenuName</span> 48 </a> 49 @if (!leaf) 50 { 51 @RenderChildren(itemInfo.Children) 52 } 53 </li> 54 } 55 </ul> 56 <div class="jquery-accordion-menu-footer"> 57 </div> 58 </div> 59 <script> 60 require(['jquery', 'accordionmenu'], function ($) { 61 var $sidebar = $("#@(controlId)"); 62 63 $sidebar.jqueryAccordionMenu(); 64 65 $("a", $sidebar).click(function (e) { 66 var $this = $(this); 67 68 if (!$this.data("leaf")) { 69 e.preventDefault(); 70 } else { 71 var feature = $this.data("feature"); 72 73 if (feature) { 74 e.preventDefault(); 75 window.open($this.attr("href"), $this.attr("target"), feature); 76 } 77 } 78 }); 79 $("li", $sidebar).click(function () { 80 $("li.active", $sidebar).removeClass("active"); 81 $(this).addClass("active"); 82 }); 83 }); 84 </script>

?

Cshtml中,我們用到了@functions的寫法,其實就是相當于在cshtml中編寫cs的方法,一般這個方法要求返回的是IHtmlContent。

?

進階:資源性視圖的應用

按照以往的慣例,我們依舊還一個進階,說明下ViewComponent中的cshtml作為嵌入的資源該如何寫。

其實做法和TagHelper是一樣的。首先是嵌入式資源方式,需要在project.json中按照如下方式編寫:

"buildOptions": {

"embed": [ "Components/**/*.cshtml", "TagHelpers/**/*.cshtml" ]

}

然后再寫一個擴展方法,同上個文檔的EmbeddedFileServiceCollectionExtensions,最后是在Startup.cs中使用這個擴展方法。

因為我們的ViewComponet和TagHelper都在同一個WebControls項目中,因此進階部分的代碼根本不需要再寫了。這里再重復說明的原因是,在沒有寫過上述代碼的情況下,如何將ViewComponent的Cshtml作為嵌入的資源。

?

面向云的.net core開發框架

轉載于:https://www.cnblogs.com/BenDan2002/p/6224816.html

總結

以上是生活随笔為你收集整理的9.2.4 .net core 通过ViewComponent封装控件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 韩国午夜激情 | 少妇真实被内射视频三四区 | 美女被艹视频网站 | 国产福利一区二区三区视频 | 婷婷色一区二区三区 | 中国特级黄色大片 | 日本美女交配 | www.色图 | 五月天中文字幕 | 在线免费看av网站 | 一二区在线观看 | 玖玖玖精品 | 成年人网站黄色 | 午夜精品导航 | 日日干夜夜骑 | 在线欧美激情 | 无码 人妻 在线 视频 | 色先锋资源网 | 国产精品爽爽久久久久久 | missav在线| 豆花视频在线播放 | 欧美xx视频 | 中文字幕亚洲不卡 | 伊人自拍视频 | 无码人妻av免费一区二区三区 | 韩国日本在线观看 | 无码日韩精品一区二区 | 免费毛片软件 | 青青操操| 男女高h视频| 亚洲欧洲日韩 | 蜜臀尤物一区二区三区直播 | 黄色污在线观看 | 日本大尺度电影免费观看全集中文版 | 粉嫩av一区二区三区免费观看 | 蜜桃av噜噜一区二区三区小说 | 在线观看v片 | 麻豆免费观看视频 | 久草97 | 精品盗摄一区二区三区 | caoprom97| 激情四射网站 | 国产亚洲一区二区三区在线观看 | 国产鲁鲁视频在线观看免费 | 综合网天天 | 成人在线观 | a∨色狠狠一区二区三区 | 精品国产乱码久久久 | 日本四级电影 | 成人第一页 | 在线cao| yy111122少妇光屁股影院 | 一区二区欧美在线观看 | 色伊人 | 一级草逼片 | 无码人妻丰满熟妇啪啪 | 亚洲天堂手机在线观看 | 中文字幕第一页在线播放 | 在线日韩国产 | 国产另类精品 | 欧日韩视频 | 欧美专区在线观看 | 国产日本在线观看 | 精品一区二区三区无码视频 | 日韩在线观看视频一区二区 | 香蕉视频1024 | 粗大挺进潘金莲身体在线播放 | 韩国在线不卡 | 久久精品国产清自在天天线 | 日本久久片 | 男女性网站| 粗大的内捧猛烈进出在线视频 | 国产孕妇一区二区三区 | 黄色精品 | 深夜天堂 | 好看的中文字幕av | 深夜视频在线观看免费 | 欧美精品久久久久久久久久 | 国产91精品欧美 | v天堂在线观看 | 国产一级片a | 男人插入女人阴道视频 | 国产一区亚洲二区三区 | 日韩国产电影 | 奇米影视四色在线 | 俺啪也 | 精品伦精品一区二区三区视频密桃 | 中国大陆高清aⅴ毛片 | 在线成人播放 | 69式视频 | 怡红院毛片 | 国产免费又粗又猛又爽 | 狠狠狠狠狠 | www精品一区二区三区 | 天天综合在线视频 | 一级成人免费视频 | 亚洲午夜视频在线观看 | 激情久久网 | 黑人激情视频 |