在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
视图组件是 ASP.NET Core MVC 中的新特性,与局部视图相似,但是它们更加的强大。视图组件不使用模型绑定,只取决于调用它时所提供的数据。视图组件有以下特点:
视图组件可以用在任何需要重复逻辑且对局部视图来说过于复杂的情况,比如:
一个 视图组件 包含两个部分,类(通常派生自 创建视图组件这个章节包含创建视图组件的高级需求。在稍后的文章中,我们将详细地检查每一个步骤,并创建一个视图组件。 视图组件类一个视图组件类可以由以下任何一个方式创建:
如同控制器一样,视图组件必须是公开的,非嵌套的,以及非抽象的类。视图组件名称是类名并去掉“ViewComponent”后缀。也可以通过 ViewComponentAttribute.Name 属性进行明确的指定。 一个视图组件类:
视图组件方法视图组件在
视图搜索路径运行时对视图的搜索路径如下:
视图组件默认的视图名是 Default,意味着通常你的视图文件会命名为 Default.cshtml。当你创建视图组件结果或者调用 我们建议你命名视图文件为 Default.cshtml 并且使用 Views/Shared/Components/<view_component_name>/<view_name> 路径。在这个例子中使用的 调用视图组件要使用视图组件,从视图中调用
从控制器直接调用视图组件视图组件通常从视图中调用,但是你也可以从控制器方法中直接调用。当视图组件没有像控制器一样定义终结点时,你可以简单实现一个控制器的 Action ,并使用一个 ViewComponentResult作为返回内容。 在这例子中,视图组件通过控制器直接调用:
演练:创建一个简单的视图组件生成并测试启动代码。这是一个简单的项目,使用一个
添加一个视图组件类创建一个 ViewComponents 文件夹并添加下面的 using Microsoft.AspNet.Mvc; using Microsoft.Data.Entity; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using ViewComponentSample.Models; namespace ViewComponentSample.ViewComponents { public class PriorityListViewComponent : ViewComponent { private readonly ToDoContext db; public PriorityListViewComponent(ToDoContext context) { db = context; } public async Task<IViewComponentResult> InvokeAsync( int maxPriority, bool isDone) { var items = await GetItemsAsync(maxPriority, isDone); return View(items); } private Task<List<TodoItem>> GetItemsAsync(int maxPriority, bool isDone) { return db.ToDo.Where(x => x.IsDone == isDone && x.Priority <= maxPriority).ToListAsync(); } } }
代码注释:
创建视图组件 Razor 视图
@model IEnumerable<ViewComponentSample.Models.TodoItem> <h3>Priority Items</h3> <ul> @foreach (var todo in Model) { <li>@todo.Name</li> } </ul>
Razor 视图取一组 如果视图组件是特定控制器的,你可以添加到特定控制器文件夹(Views/Todo/Components/PriorityList/Default.cshtml)。
标记 下面的图片显示了 Priority 项:
你也可以从控制器直接调用视图组件:
指定视图名一个复杂的视图组件在某些条件下可能需要指定非默认的视图。下面的代码展示如何从 public async Task<IViewComponentResult> InvokeAsync(int maxPriority, bool isDone) { string MyView = "Default"; // 手动高亮 // If asking for all completed tasks, render with the "PVC" view. // 手动高亮 if (maxPriority > 3 && isDone == true) // 手动高亮 { // 手动高亮 MyView = "PVC"; // 手动高亮 } // 手动高亮 var items = await GetItemsAsync(maxPriority, isDone); return View(MyView, items); }
复制 Views/Shared/Components/PriorityList/Default.cshtml 文件到一个视图中并命名为 Views/Shared/Components/PriorityList/PVC.cshtml。添加一个标题到 PVC 视图来表明正在使用此视图。 @model IEnumerable<ViewComponentSample.Models.TodoItem> <h2> PVC Named Priority Component View</h2> // 手动高亮 <h4>@ViewBag.PriorityMessage</h4> <ul> @foreach (var todo in Model) { <li>@todo.Name</li> } </ul>
更新 Views/TodoList/Index.cshtml
运行应用程序并验证 PVC 视图。 如果 PVC 视图没有渲染,请验证你是否使用 4 或者更高 priority 参数来调用视图组件。 检查视图路径
避免魔法字符串如果你想编译时安全你可以用类名替换硬编码视图组件名。创建视图组件不以 "ViewComponent" 作为后缀: using Microsoft.AspNet.Mvc; using Microsoft.Data.Entity; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using ViewComponentSample.Models; namespace ViewComponentSample.ViewComponents { public class PriorityList : ViewComponent // 手动高亮 { private readonly ToDoContext db; public PriorityList(ToDoContext context) // 手动高亮 { db = context; } public async Task<IViewComponentResult> InvokeAsync( int maxPriority, bool isDone) { var items = await GetItemsAsync(maxPriority, isDone); return View(items); } private Task<List<TodoItem>> GetItemsAsync(int maxPriority, bool isDone) { return db.ToDo.Where(x => x.IsDone == isDone && x.Priority <= maxPriority).ToListAsync(); } } }
添加一个 @using ViewComponentSample.Models @using ViewComponentSample.ViewComponents @model IEnumerable<TodoItem> <h2>ToDo nameof</h2> <!-- Markup removed for brevity. --> } </table> <div> @await Component.InvokeAsync(nameof(PriorityList), new { maxPriority = 4, isDone = true }) </div>
|
请发表评论