.NET5 MVC6 提供两种自定义UI扩展方式:
一种是自定义HTML标签的方式:使用TagHelpers(标签),上一章中已经讲过
第二种是返回自定义内容的方式:使用ViewComponent(组件)
本次进行简单入门讲解的是:ViewComponent
一、首先来看看我自定义的组件:
public class TableTopViewComponent : ViewComponent { public async Task<IViewComponentResult> InvokeAsync(PageModel page, List<ButtonEnum> button = null, List<SelectEnum> select = null) { var btn = button ?? new List<ButtonEnum>(); var slt = select ?? new List<SelectEnum>(); ViewBag.btn = btn; ViewBag.slt = slt; return View("TableTop", page); } }
注意:生成的视图文件位置必须在以下3个位置:
/Views/{Controller Name}/Components/{View Component Name}/{View Name}
/Views/Shared/Components/{View Component Name}/{View Name}
/Pages/Shared/Components/{View Component Name}/{View Name}
本案例放在如图所示:
在return View("TableTop", page)语句中,红字则为视图文件(.cshtml)的前缀名!!!若不指定,则生成的文件名是Default.cshtml。
二、对应的Razor页面(cshtml)代码:
@{ List<ButtonEnum> button = ViewBag.btn; List<SelectEnum> select = ViewBag.slt; } <div class="row dataTables_opts" style="padding: 0 0 .55em;"> <div class="col-md-5"> <label>每页显示:</label> <select class="form-control d-inline w-auto" asp-for="PageSize"> <option value="2">2</option> <option value="10">10</option> <option value="20">20</option> <option value="35">35</option> <option value="50">50</option> <option value="100">100</option> </select> <label>行</label> </div> <div class="col-md-5"> @if (button.Any() && button.Count > 0) { foreach (var btn in button) { var desc = btn.GetEnumDescription(); switch (btn) { case ButtonEnum.AddRole: <add-button url="@Url.Action("RoleModify","Auth")" title="@desc"></add-button> break; case ButtonEnum.AddMenu: <add-button url="@Url.Action("MenuModify","Auth")" title="@desc"></add-button> break; case ButtonEnum.AddUser: <a asp-action="" asp-controller="User" class="btn btn-primary"> @desc <i class="icon-circle-with-plus"></i> </a> break; case ButtonEnum.AddPromote: <add-button url="@Url.Action("Modify","Promote")" title="@desc"></add-button> break; case ButtonEnum.AddAuthInfo: <add-button url="@Url.Action("QualiModify","Merchant")" title="@desc"></add-button> break; case ButtonEnum.AddShop: <add-button url="@Url.Action("ShopModify","Merchant")" title="@desc"></add-button> break; case ButtonEnum.AddPraise: <add-button url="@Url.Action("ModifyComment","Praise")" title="@desc"></add-button> break; case ButtonEnum.AddProduct: <add-button url="@Url.Action("ProductModify","Manage")" title="@desc"></add-button> break; case ButtonEnum.AddCoupon: <add-button url="@Url.Action("CouponModify","Manage")" title="@desc"></add-button> break; case ButtonEnum.DrawCoupon: <add-button url="@Url.Action("DrawCoupon","Merchant")" title="@desc"></add-button> break; } } } </div> <div class="col-md-2"> <input type="text" class="form-control d-inline" asp-for="Key" placeholder="输入关键字,回车进行查询……" /> </div> </div>
这部分不用多讲,就是常规的Razor页面代码,注重提一下其中的add-button标签则为上一讲中的TagHelper
三、Razor页面(cshtml)调用方法:
@await Component.InvokeAsync("TableTop", new { page, button = new List<ButtonEnum>() { ButtonEnum.AddUser } })
注意:引号里面的值则为组件的名称,须保持一致!!!
四、最终效果:
如紫色圈出的部分,整个表头即是上面的组件展现出来的,表尾的条数及页码显示也是一个组件,这样的好处就是代码利用率大大提高,使页面内容更少更整洁更易维护,没用上的小伙伴赶快用起来吧,相当的好用!!