前言

大概一个来星期未更新博客了,久违了各位,关于SQL Server性能优化会和ASP.NET Core MVC穿插来讲,如果你希望我分享哪些内容可以在评论下方提出来,我会筛选并看看技术文档来对你的内容进行解答,借此希望我们能共同进步和学习。本节我们来讲讲ASP.NET Core  MVC中的视图组件。

Web应用程序下管理ViewComponents

我是奔着项目用到了哪些就会去写对应的技术博客,在我们项目中利用视图组件来加载权限菜单,这一块是我老大所做,我也就粗略看了看使用方法并未深入借此机会去学习学习,最近老大要我研究.net core中的加密和解密,我也在摸索着并学习着后续可能再来详细讲讲.net core中的加密和解密。视图组件类似于我们之前ASP.NET MVC中的部分视图,不过其功能比部分视图更加强大,它不会依赖于强类型视图,也和部分视图一样重在重用,到底多强大我们下面一起来见识下。首先我们过一过基本原理。通过调用 InvokeAsync 方法来调用视图组件,此方法定义在 IViewComponentHelper 接口中,如下:

视图组件并不直接处理请求,主要可以用来初始化数据或者获取数据后并通过上述方法来进行渲染,从上述方法参数中并未包含任何http请求信息而得知。那么问题来了,视图组件是如何进行查找哪些是视图组件呢,也就是说从哪些路径去查找呢,从如何两个路径去查找视图组件。

Views/<controller_name>/Components/<view_component_name>/<view_name>
Views/Shared/Components/<view_component_name>/<view_name>

默认的视图组件名称为Default,所以我们可以根据视图页定义为Default.cshtml,当然我们也可以自定义。虽然上述有两种查找视图组件的形式,但是.net core团队推荐我们以如下路径形式来放置视图组件。

Views/Shared/Components/<view_component_name>/<view_name>

看到官网写的那么多还不容易理解,这里我们约定规则组件类以ViewComponent结尾。我将用最浅显的实例来让看这篇文章的园友快速上手。首先我们建立一个组件类。

    public class PersonViewComponent : ViewComponent
{ }

直接看下图按照上述所讲。

我们定义了一个组件控制器如下:

   [Route("[Controller]")]
public class ViewComponentController : Controller
{
[HttpGet("[action]")]
public IActionResult Index()
{
return View();
}
}

然后在其Index方法里面来调用组件。

@await Component.InvokeAsync("Person")

此时你将看到如下错误:

上述说明未调用InvokeAsync方法,接下来我们在组件类里面写一个InvokeAsync方法。此时将演变成如下这样:

    public class PersonViewComponent : ViewComponent
{
public Task<string> InvokeAsync()
{
return Task.FromResult("Jeffcky from cnblogs");
}
}

此时则成功,如下:

上述我们只是演示其冰山一角,上述只是直接返回一个字符串而已。要是返回视图该如何操作呢?我们来看看:

    public class PersonViewComponent : ViewComponent
{
private IBlogRepository _blogRepository;
public PersonViewComponent(IBlogRepository blogRepository)
{
_blogRepository = blogRepository;
}
public async Task<IViewComponentResult> InvokeAsync()
{
var blogs = await GetBlogsAsync();
return View(blogs);
} private Task<List<Blog>> GetBlogsAsync()
{
var blogs = _blogRepository.GetAll().Take().ToList();
return Task.FromResult(blogs);
}
}

接下来在返回的默认组件名称为Default.cshtml中获取数据并遍历:

@{
Layout = null;
}
@using EFCore.Model.Entities
@model List<Blog>
<h3>Best sellers</h3>
<ul style="padding-left:0;list-style-type:none;">
@foreach (var blog in Model)
{
<li>@blog.Name-@blog.Url</li>
}
</ul>

 上述我们需要通过返回类型为IViewComponentResult 来加载视图。

单独建立类库管理ViewComponents

上述我们操作视图组件是在Web应用程序下轻而易举,如果是将视图组件作为一个类库来管理,这就有点难度了,为了方便管理视图组件我们尝试将视图组件单独建立一个类库来管理,此时我们又该如何操作呢,我们来看看,首先请确保.net core版本为1.1,1.0版本未测试,通过如下位置来看当前版本或者到 C:\Program Files\dotnet 查看版本:

第一步:此时我们建立一个组件类库并将视图文件全部归纳到类库下,如图:

第二步:在组件类库中projecy.json添加MVC包,如下:

"Microsoft.AspNetCore.Mvc": "1.1.0",

第三步:继续在project.json中添加查找组件视图选项,如下:

"buildOptions": {
"embed": "Views/**/*.cshtml"
}

【注意】一定要记得添加上述选项,否则出现如下错误

第四步:接下来则是在Web下引用该类库并解析上述类库程序集将其视图组件进行嵌入,需要下载如下程序包

第五步:接下来我们去利用FileProvider去加载组件程序集获取组件中派生自ViewComponent的类,如下:

            var assmebly = typeof(ComponentLibrary.PersonViewComponent).GetTypeInfo().Assembly;
var embeddedFileProvider = new EmbeddedFileProvider(assmebly, "ComponentLibrary"); services.Configure<RazorViewEngineOptions>(options =>
{
options.FileProviders.Add(embeddedFileProvider);
});

最后一步:改写调用InvokeAsync方法参数,如下:

@await Component.InvokeAsync("ComponentLibrary.Person")

此时让我联想到ASP.NET MVC中控制器约定以Contrller结尾,否则查找不到,那么对于视图组件约定规范也是以ViewComponent结尾,那么打破这种约定是否好使呢,我们试试看。我们将视图组件修改如下:

    public class PersonComponent : ViewComponent
{...}

其余也一并进行对应修改,同时对调用方法也进行如下修改:

@await Component.InvokeAsync(nameof(ComponentLibrary.PersonComponent))

经过检验也是准确无误,但是还是按照约定规范来,这里只是做一个验证而已。对于视图组件介绍到此结束,其他比较基本的东西就不再叙述,比如可以和部分视图一样在控制器方法中进行调用组件,如下:

        public IActionResult TestViewComponent()
{
return ViewComponent("", "");
}

以及视图组件还有中还可以进行参数传递,和部分视图别无二致,部分视图有的视图组件都有,而视图组件有的部分视图肯定没有,由此知,视图组件的强大。

总结

本节比较详细的讲述了视图组件的基本使用以及扩展深入将其隔离开来单独建立一个视图组件类库,希望对阅读本文的你有所帮助。

ASP.NET Core MVC之ViewComponents(视图组件)的更多相关文章

  1. ASP.NET Core MVC之ViewComponents(视图组件)知多少?

    前言 大概一个来星期未更新博客了,久违了各位,关于SQL Server性能优化会和ASP.NET Core MVC穿插来讲,如果你希望我分享哪些内容可以在评论下方提出来,我会筛选并看看技术文档来对你的 ...

  2. 007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】

    Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Changing vi ...

  3. ASP.NET Core MVC 中自定义视图

    ASP.NET Core MVC 中的视图发现 ASP.NET Core MVC 中有提供了几个 View()的重载方法. 如果我们使用下面提供 View()的重载方法,它将查找与 Action 方法 ...

  4. ASP.NET Core MVC的Razor视图中,使用Html.Raw方法输出原生的html

    我们在ASP.NET Core MVC项目中,有一个Razor视图文件Index.cshtml,如下: @{ Layout = null; } <!DOCTYPE html> <ht ...

  5. Asp.Net Core MVC控制器和视图之间传值

    一.Core MVC中控制器和视图之间传值方式和Asp.Net中非常类似 1.弱类型数据:ViewData,ViewBag 2.强类型数据:@model 二.代码 实例  1.ViewData pub ...

  6. 在Asp.Net Core MVC 3.0 视图运行时编译

    在正常情况下,视图在生成的时候就会变为 xxx.Views.dll,在开发的时候,这样很不方便,因为很多的时候,我们只是修改一个样式,调整一些JavaScript代码,这个时候要把项目调试暂停下来,生 ...

  7. ASP.NET Core MVC 之视图(Views)

    ASP.NET Core MVC 控制器可以使用视图返回格式化的结果. 1.什么是视图 在 MVC 中,视图封装了用户与应用交互呈现细节.视图是具有生成要发送到客户端内容的,包含嵌入代码的HTML模板 ...

  8. ASP.NET Core 入门教程 7、ASP.NET Core MVC 分部视图入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...

  9. ASP.NET Core 入门笔记8,ASP.NET Core MVC 分部视图入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...

随机推荐

  1. C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...

  2. 拆开Ceph看队列和线程

    作者:吴香伟 发表于 2017/01/08 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 我上小学时家离学校很远,家在某某山脚,学校在镇里.每周回家一趟,周五放 ...

  3. 基于服务的SOA架构_后续篇

    今天是元宵节,首先祝各位广大博友在接下来的光阴中技术更上一层,事事如意! 昨天简单介绍了一下本人在近期开发过的一个电商购物平台的架构流程和一些技术说明:今天将详细总结一下在项目中用到的各个架构技术的环 ...

  4. 百度云推送----iOS

    前言 记录一下这几天学习的百度推送,觉得这个东西弄的还挺糟心的,好多注意的地方 正文 1.先申请一个百度开发者账号 http://push.baidu.com/fc 2.创建一个新应用,并应用配置 3 ...

  5. React-intl 实现多语言

    前言 React 做国际化,我推荐使用 React-intl , 这个库提供了 React 组件和Api两种方式来格式化日期,数字和字符串等.知道这个库了,那让我们开始使用它 组件用法 为了和Reac ...

  6. EM and GMM(Code)

    In EM and GMM(Theory), I have introduced the theory of em algorithm for gmm. Now lets practice it in ...

  7. jQuery UI 实例 - 自动完成(Autocomplete)

    http://www.runoob.com/jqueryui/example-autocomplete.html 自定义数据并显示 您可以使用自定义数据格式,并通过简单地重载默认的聚焦和选择行为来显示 ...

  8. Memcached服务安装

    安装Memcached服务 memcache分为服务端和客户端程序 服务端程序用来支持存储k-v值,程序名称memcached 客户端与服务端通信,进行存取值(常用的如php的memcache扩展,m ...

  9. android学习19--Matrix.mapPoints作用

    android图形的旋转,缩放,平移都是用matrix实现的.可以用mapPoints来计算一个点旋转,缩放,平移后的坐标.看下面例子. Matrix matrix = new Matrix(); m ...

  10. liunx常用命令

    查看系统信息常用命令 uname -m /arch      显示机器的处理架构 uname -r                显示正在使用的内核版本 cat/proc/cpuinfo      显 ...