View Component

在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为MVC中没有类似Web Forms中的WebControl的功能。但在MVC6中,这一功能得到了极大的改善。新版MVC6中,提供了一种叫做View Component的功能。

你可以将View Component看做是一个mini的Controller——它只负责渲染一小部分内容,而非全部响应,所有Partial View能解决的问题,你都可以使用View Component来解决,比如:动态导航菜单、Tag标签、登录窗口、购物车、最近阅读文章等等。

View Component包含2个部分,一部分是类(继承于ViewComponent),另外一个是Razor视图(和普通的View视图一样)。就像新版MVC中的Controller一样,ViewComponent也可以使POCO的(即不继承ViewComponent类,但类名以ViewComponent结尾)。

View Component的创建

目前,View Component类的创建方式有如下三种:

  1. 直接继承于ViewComponent
  2. 给类加上ViewComponent特性,或继承于带有ViewComponent特性的类
  3. 创建一个类,类名以ViewComponent结尾

和Controller一样,View Component必须是public的,不能嵌套,不能是抽象类。

举例来说,我们创建一个View Component,类名为TopListViewComponent,代码如下:

public class TopListViewComponent : ViewComponent
{
private readonly ApplicationDbContext db; public TopListViewComponent(ApplicationDbContext context)
{
db = context;
} public IViewComponentResult Invoke(int categoryId, int topN)
{
List<string> col = new List<string>();
var items = db.TodoItems.Where(x => x.IsDone == false &&
x.categoryId == categoryId).Take(topN); return View(items);
}
}

上述类,也可以定义成如下这样:

[ViewComponent(Name = "TopList")]
public class TopWidget
{
// 其它类似
}

通过在TopWidget类上定义一个名称为TopList的ViewComponent特性,其效果和定义TopListViewComponent类一样,系统在查找的时候,都会认可,并且在其构造函数中通过依赖注入功能提示构造函数中参数的类型实例。

Invoke方法是一个约定方法,可以传入任意数量的参数,系统也支持InvokeAsync方法实现异步功能。

View Component的视图文件创建

以在ProductController的视图里调用View Component为例,我们需要在Views\Product文件夹下创建一个名称为Components的文件夹(该文件夹名称必须为Components)。

然后在Views\Product\Components文件夹下创建一个名称为TopList 的文件夹(该文件夹名称必须和View Component名称一致,即必须是TopList)。

Views\Product\Components\TopList文件夹下,创建一个Default.cshtml视图文件,并添加如下标记:

@model IEnumerable<BookStore.Models.ProductItem>

<h3>Top Products</h3>
<ul>
@foreach (var todo in Model)
{
<li>@todo.Title</li>
}
</ul>

如果再View Component中,没有指定视图的名称,将默认为Default.cshtml视图。

至此,该View Component就创建好了,你可以在Views\Product\index.cshtml视图中的任意位置调用该View Component,比如:

  <div class="col-md-4">
@Component.Invoke("TopList", 1, 10)
</div>

如果在上述TopListViewComponent中定义的是异步方法InvokeAsync的话,则可以使用@await Component.InvokeAsync()方法来调用,这两个方法的第一个参数都是TopListViewComponent的名称,剩余的参数则是在TopListViewComponent类中定义的方法参数。

注意:一般来说,View Component的视图文件都是添加在Views\Shared文件夹的,因为一般来说ViewComponent不会特定于某个Controller。

使用自定义视图文件

一般来说,如果要使用自定义文件,我们需要在Invoke的方法返回返回值的时候来指定视图的名称,示例如下:

return View("TopN", items);

那么,就需要创建一个Views\Product\Components\TopN.cshtml文件,而使用的时候则无需更改,还是指定原来的View Component名称即可,比如:

@await Component.InvokeAsync("TopList",  1, 10)  //以异步调用为例

总结

一般来说,建议在通用的功能上使用View Component的功能,这样所有的视图文件都可以放在Views\Shared文件夹了。

同步与推荐

本文已同步至目录索引:解读ASP.NET 5 & MVC6系列

View Component的更多相关文章

  1. 解读ASP.NET 5 & MVC6系列(14):View Component

    在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为MVC中没有类似Web Forms中的WebControl的功能.但在MVC6中,这一功能得到了 ...

  2. [转]asp.net core中的View Component

    解读ASP.NET 5 & MVC6系列(14):View Component http://www.cnblogs.com/TomXu/p/4496486.html

  3. ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 23. 继续讲Tag Helpers 和复习View Component

    当条件为true就渲染,否则就不渲染 ‘ 判断用户的登陆 更好的一点是做一个TagHelper.把这些明显的C#代码都去掉.最终都是用html和属性的形式来组成一个最终的代码 属性名称等于Confit ...

  4. 移花接木:借助 IViewLocationExpander 更换 ASP.NET Core View Component 视图路径

    端午节在家将一个 asp.net 项目向 asp.net core 迁移时遇到了一个问题,用 view component 取代 Html.RenderAction 之后,运行时 view compo ...

  5. MVC+EFCore 完整教程18 -- 升级分布视图至 View Component

    之前我们详细介绍过分布视图(partial view),在有一些更加复杂的场景下,.net core为我们提供了更加强大的组件 view  component, 可以认为view component是 ...

  6. asp.net core mvc View Component 应用

    ViewComponent 1.View 组件介绍 在ASP.NET CORE MVC中,View组件有点类似于partial views,但是他们更强大,View组件不能使用model bindin ...

  7. MVC + EFCore 项目实战 - 数仓管理系统6 – 数据源管理上--使用view component完成卡片列表

    上次课程我们完成了菜单的配置和开发里程碑的划定. 按照计划,我们先来开发数据仓库管理中的数据源管理(对应菜单为:数据仓库管理 / 数据源),首批支持的数据源是SQL SERVER数据库. 一.数据源管 ...

  8. ASP.NET Core MVC 之视图组件(View Component)

    1.视图组件介绍 视图组件是 ASP.NET Core MVC 的新特性,类似于局部视图,但它更强大.视图组件不使用模型绑定,并且仅依赖于调用它时所提供的数据. 视图组件特点: 呈块状,而不是整个响应 ...

  9. [译]View components and Inject in ASP.NET MVC 6

    原文:http://www.asp.net/vnext/overview/aspnet-vnext/vc 介绍view components view components (VCs) 类似于part ...

随机推荐

  1. php学习笔记--高级教程--读取文件、创建文件、写入文件

    打开文件:fopen:fopen(filename,mode);//fopen("test.txt","r"): 打开模式:r  仅仅读方式打开,将文件指针指向 ...

  2. Cookie rejected: Illegal path attribute &quot;/nexus&quot;. Path of origin: &quot;/content/&quot; 解

    问题叙述性说明 通过运行"mvn clean deploy" 命令 将 Maven 项目公布 Nexus 当PW.举例控制台输出以下警告消息: [INFO] Downloaded: ...

  3. Eclipse热键

    Eclipse编辑功能很强大.掌握Eclipse快捷功能.高开发效率.Eclipse中有例如以下一些和编辑相关的快捷键.     1. [ALT+/]     此快捷键为用户编辑的好帮手.能为用户提供 ...

  4. 读书时间《JavaScript高级程序设计》四:BOM,客户端检测

    隔了一段时间,现在开始看第8章. 第8章:BOM BOM提供了很多对象,用于访问浏览器的功能.BOM的核心对象是window,它表示浏览器的一个实例. window对象是通过javascript访问浏 ...

  5. yum 安装时错误 Errno 14 Couldn't resolve host 解决办法(转)

    在安装mlocate的时候发现一直报错,错误内容大致如下 Downloading Packages:http://mirrors.163.com/centos/6.5/os/i386/Packages ...

  6. Java的λ表达(lambda)

    λ表达的基本目的 回调Java8的λ表达式 说明了Java8的λ表达式的基本用途:完毕了回调的原意--代码的參数化. 回调:能够简单地说,假设你的方法须要override底层或JDK的某个类的方法,并 ...

  7. linux内核数据包转发流程(三)网卡帧接收分析

    [版权声明:转载请保留出处:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 每一个cpu都有队列来处理接收到的帧,都有其数据结构来处理入口和出口流量,因此,不 ...

  8. POJ9384 迷宫(基金会BFS)

    本文来源于:http://blog.csdn.net/svitter 称号:让你从(0, 0)走到(4,4).而且输出路径. 输入数据:二位数组的迷宫:输出数据:路径: 题解:简单的BFS 注意: 1 ...

  9. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&amp;勘误&amp;配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  10. 【Espruino】NO.03 从点灯开始

    http://blog.csdn.net/qwert1213131/article/details/26819773 本文属于个人理解,能力有限,纰漏在所难免,还望指正! [小鱼有点电] 点灯程序应该 ...