在asp.net core mvc中增加了ViewComponent(视图组件)的概念,视图组件有点类似部分视图,但是比部分视图功能更加强大,它更有点像一个控制器。

使用方法

1,定义类派生自ViewComponent类

2,增加Task<IViewComponentResult> InvokeAsync方法

3,在InovkeAsync方法中增加逻辑,并返回视图结果

4,在类上增加ViewComponent特性,可以标注组件名称:[ViewComponent(Name="组件名称")]。这一步不是必需的。

具体实例:

    [ViewComponent(Name="templatetest")]
public class TemplateViewComponent:ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync()
{
return View("~/Views/test.cshtml");
}
}  

另外,我们可以给InvokeAsync方法增加参数,在调用组件的时候,可以传递数据,如下:

   [ViewComponent(Name ="Pager")]
public class Pager: ViewComponent
{
public Task<IViewComponentResult> InvokeAsync(int page,int pagesize,int count)
{
ViewBag.PageIndex = page;
ViewBag.PageSize = pagesize;
int totalPage = count / pagesize; if (count%pagesize>0)
{
totalPage += 1;
} ViewBag.PageTotal = totalPage;
ViewBag.RecordCount = count;
return Task.FromResult<IViewComponentResult>(View("~/Views/ViewComponets/Pager.cshtml"));
}
}

视图组件创建好后,在视图上使用以下方法调用:

@await Component.InvokeAsync("组件名称",参数对象)或者@await Component.InvokeAsync(typeof(组件),参数对象)

View Components as Tag Helpers

在asp.net core mvc 1.1版本中,又增加了一个新的特性,就是可以使用标签方式调用视图组件,类似下列效果:

<vc:组件名称 param1="" param2=""></vc:组件名称>

这有什么好处?Component.Invoke是在视图中使用C#代码执行视图组件,而标签方式更贴近前端技术,对前端开发人员来说更友好。另外一个就是我们实现一个在线模板编辑器也更加的方便。

要实现一个在线模板编辑器我们可以分几步走:

第一步:先实现简单修改视图代码,可以带到我们需要的效果

第二步:提供在线的html代码编辑器,直接在线编辑html代码

第三步:提供组件配置窗口,可以配置对应的参数

第四步:可视化的页面编辑

以一个企业展示站点作为场景,来说一下实现思路:

一般一个企业展示网站主要用于企业信息宣传使用,表现形式就是文章,网站首页会包含很多内容板块,每个板块有自己的一些特性,比如展示条数,内容来源,滚动显示等。如下内容设置

第一步:先实现简单修改视图代码,可以带到我们需要的效果

我们可以在控制器中根据需要获取所需要的数据,然后直接绑定到视图上,但是如果客户要求有变动,比如展示条数的变动,我们只能是修改代码,重新发布,比较麻烦。所以我们可以把这些内容块做成一个一个的组件,然后在视图上直接调用,假设我们定义组件叫ContentBlockViewComponent,具体逻辑如下:

[ViewComponent(Name="contentblock")]
public class ContentBlockViewComponent:ViewComponent
{
/// <summary>
/// 内容展示组件
/// </summary>
/// <param name="showCount">显示条数</param>
/// <param name="source">信息来源板块</param>
/// <returns></returns>
public async Task<IViewComponentResult> InvokeAsync(int showCount,int source)
{
//TODO:根据参数从指定板块获取数据
return View("~/Views/ContentBlock.cshtml");
}
}

  

 然后我们在首页视图上使用<vc:contentblock showcount="6" source="1"/>展示内容。当参数发生改变时,我们可以直接在视图上修改组件调用方法即可。到此我们实现了第一步:简单修改代码实现想要的效果。

第二步:提供在线的html代码编辑器,直接在线编辑html代码

这一步其实也很好实现,直接在系统中增加一个在线html编辑器(使用codemirror),直接通过读取视图文件内容,展示到前台页面上,根据需要修改代码并提交保存。实现到这一步,对于最终用户来说,还是需要掌握一定的html知识,所以一般比较难,只能提供给开发使用。

第三步:提供组件配置窗口,可以配置对应的参数

codemirror中有一个Tag Matcher组件,我们可以以这个为思路,实现一个标签选中事件,读取当前标签的一些信息,并在配置窗口中显示对应信息,这个的还没具体实现。如果这部分可以实现,应该一小部分用户就可以自己操作了。

第四步:可视化的页面编辑

这是终极目标,我的思路是直接在页面上呈现页面内容,可以在视图组件输出视图上增加一个根标签,如

<div viewcomponent="组件名称">其他视图内容</div>

然后在页面上使用jquery给带有viewcomponet属性的标签增加mouseover事件,当鼠标移动到div上后,显示一个设置按钮,点击按钮弹出类似第三部的配置窗口,在配置窗口中填写参数,并保存。提交保存的时候,需要把页面的名称及组件的名称传递到服务器端,服务器端接收后,首先找到对应的view文件,然后读取内容,再进行html分析(可以使用htmlagilitypack),找到对应的视图组件标签,进行参数替换,最后保存文件内容。到此完成一个配置的过程。

第三步跟第四步的实现代码后续会慢慢提供。

View Components as Tag Helpers,离在线模板编辑又进一步的更多相关文章

  1. [asp.net core] Tag Helpers 简介(转)

    原文地址 https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro What are Tag Helpers? ...

  2. ASP.NET Core 中文文档 第四章 MVC(3.6.2 )自定义标签辅助类(Tag Helpers)

    原文:Authoring Tag Helpers 作者:Rick Anderson 翻译:张海龙(jiechen) 校对:许登洋(Seay) 示例代码查看与下载 从 Tag Helper 讲起 本篇教 ...

  3. [asp.net core]定义Tag Helpers

    原文地址 https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring Getting started wi ...

  4. ASP.NET 5系列教程 (三):view components介绍

    在ASP.NET MVC 6中,view components (VCs) 功能类似于虚拟视图,但是功能更加强大. VCs兼顾了视图和控制器的优点,你可以把VCs 看作一个Mini 控制器.它负责控制 ...

  5. ASP.NET Core MVC Tag Helpers 介绍

    简介 Tag Helpers 提供了在视图中更改和增强现有HTML元素的功能.将它们添加到视图中,会经过Razor模板引擎处理并创建一个HTML,之后再返回给浏览器.有一些Tag Helpers,其实 ...

  6. ASP.NET Core MVC – Tag Helpers 介绍

    ASP.NET Core Tag Helpers系列目录,这是第一篇,共五篇: ASP.NET Core MVC – Tag Helpers 介绍 ASP.NET Core MVC – Caching ...

  7. [转] asp.net core Introducing View Components

    本文转自:http://www.c-sharpcorner.com/uploadfile/8c19e8/asp-net-5-getting-started-with-asp-net-mvc-6/ In ...

  8. ASP.NET Core 中文文档 第四章 MVC(3.6.1 )Tag Helpers 介绍

    原文:Introduction to Tag Helpers 作者:Rick Anderson 翻译:刘浩杨 校对:高嵩(Jack) 什么是 Tag Helpers? Tag Helpers 提供了什 ...

  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. css3 transition 和 animation实现走马灯

    这段时间在做一个App,H5的开发.页面上有公告 以走马灯的形式显示出来. 在开始直接用的marquee标签,后来发现在ios客户端,走马灯移动不够平滑,有抖动现象. 对于有强迫症的我而言是无法忍受的 ...

  2. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  3. redis 编译安装(生产环境推荐)

    一.安装redis 1.下载redis包 wget http://download.redis.io/releases/redis-3.2.1.tar.gz 2.解压redis包到/opt下 tar ...

  4. [刷题]算法竞赛入门经典(第2版) 5-7/UVa12100 - Printer Queue

    题意:一堆文件但只有一个打印机,按优先级与排队顺序进行打印.也就是在一个可以插队的的队列里,问你何时可以打印到.至于这个插队啊,题目说"Of course, those annoying t ...

  5. HotSpot的算法实现

    1.枚举根节点 可达性分析中从GC Roots节点找引用,可作为GC Roots的节点主要是全局性的引用与执行上下文中,如果要逐个检查引用,必然消耗时间.另外可达性分析对执行时间的敏感还体现在GC停顿 ...

  6. AJAX的简单梳理

    一.Ajax的简介 Ajax,异步JavaScript和XML,异步提交,无刷新技术,局部刷新技术 1)传统的客户端与服务器端交互的模式 客户端发送请求直接给服务端,服务接受到请求后进行逻辑运算,最终 ...

  7. python 之变量

    什么是变量? 变量就是存储一个不固定的值,可以随时更改其值. 1.变量不仅可以是数字,还可以是任意数据类型 2.变量名必须是大小写英文.数字和_的组合,且不能用数字开头 python变量如何存储 首先 ...

  8. php 使用composer

    之前写过相关的composer,之后碰到了几个朋友问我,我整理了一下,方便自己也方便大家日后查阅~~不玩开源的程序员不是好厨子     1.执行在线安装         curl -sS https: ...

  9. [Angularjs]$http.post与$.post

    摘要 在angularjs发送post请求的时候,确实很困惑,在传递json数据的时候,总会遇到在服务端无法接受到参数的情况,这里有必要与$.post进行比较学习一下. 一个例子 这里模拟登录的一个场 ...

  10. 4.从AbstractQueuedSynchronizer(AQS)说起(3)——AQS结语

    前两节的内容<2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放> .<3.从AbstractQueuedSynchronize ...