ASP.NET Core MVC中视图的知识和ASP.NET MVC有很多相似之处,学习难度较低。以下内容主要体现了编程中模块化的思想,模块化才应是我们关注的重点。

Layout

布局用于提供各个页面所需的公共部分,如:菜单、页头、页尾等。在ASP.NET Core中默认的布局文件是位于/Views/Shared文件夹下的_Layout.cshtml文件:

我们通常在_Layout.cshtml中引入公共资源,如:

<link href="~/css/reset.css" rel="stylesheet" />
<link href="~/css/index.css" rel="stylesheet" />

<script src="~/js/common/net/ajaxHandler.js"></script>
<environment names="Development">
<script src="~/js/lib/vue/vue.js"></script>
</environment>
<environment names="Production">
<script src="~/js/lib/vue/vue.min.js"></script>
</environment>

指定布局文件

可以在Razor视图(即,cshtml文件)中使用Layout属性来指定使用哪个布局文件:

@{
Layout="_Layout";
}

ASP.NET Core MVC搜索布局文件的方式与局部视图一样,下文中会详细说明。默认情况下,在布局文件中必须调用RenderBody方法。还可以使用RenderSection方法来引入section

View Import & View Start

View Import

可以在_ViewImport.cshtm文件中添加命名空间或者Tag Helper以供其它视图中使用,如:

@using Microsoft.AspNetCore.Identity
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

_ViewImport.cshtm文件可以使用以下指令:

  • @addTagHelper

  • @removeTagHelper

  • @tagHelperPrefix

  • @using

  • @model

  • @inherits

  • @inject

_ViewImport.cshtm文件不支持Razor文件的其它特性,如:function、section等。对于多个_ViewImports.cshtml的情况,指令运行结果遵循如下规则:

  • @addTagHelper, @removeTagHelper: 按照先后顺序执行

  • @tagHelperPrefix: 后执行的结果覆盖先执行的结果

  • @model: 后执行的结果覆盖先执行的结果

  • @inherits: 后执行的结果覆盖先执行的结果

  • @using: 引入所指定的所有命名空间,但忽略重复引用

  • @inject: 后注入覆盖先注入的同名属性

View Start

_ViewStart.cshtml文件中的代码会在所有完整视图(full view,not layout,not partial view)文件被渲染之前执行。

默认情况下,ViewImports.cshtmlViewStart.cshtml文件直接位于Views文件夹下:

  • 相比其它位置的其它位置ViewImports.cshtmlViewStart.cshtml,直接位于Views文件夹中的ViewImports.cshtmlViewStart.cshtml文件会优先执行

  • 后执行的ViewImports.cshtml文件中的内容有可能会覆盖先执行ViewImports.cshtml文件中的内容

  • ViewImports.cshtmlViewStart.cshtml文件的作用域是当前目录及子目录

Tag Helper

Tag Helper可以让服务器端代码参与到在Razor文件中创建和渲染HTML元素的工作中。

自定义Tag Helper:

public class XfhTagHelper : TagHelper
{
public string Content { set; get; }

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a";
output.Attributes.Add("href", "https://www.google.com");
output.Content.SetContent(Content);
}
}

使用Tag Helper:

@addTagHelper *,Web

<xfh content="haha">customer tag helper</xfh>

Tag Helper与HTML Helper有些相似,二者不同之处可参考:Tag Helpers compared to HTML Helpers

Tag Helper具有以下优点:

  • 类HTML语法

    这一点是我喜欢Tag Helper的原因,使用Tag Helper可以使cshtml文件中后台代码与前端的搭配更和谐,利于提升代码可读性

  • 语法智能感知

Tag Helper 作用域

  • @addTagHelper

    @addTagHelper的第一个参数表示要加载哪些Tag Helper,使用"*"表示加载所有的Tag Helper;第二个参数表示从哪个程序集中加载Tag Helper。示例如下:

    @* 需指明TagHelper的完全限定名 *@
    @addTagHelper Web.TagHelpers.XfhTagHelper,Web
  • @removeTagHelper

    @removeTagHelper也有两个参数,含义同@addTagHelper

  • @tagHelperPrefix

    给Tag Helper加上前缀标识,示例如下:

    @addTagHelper *,Web
    @tagHelperPrefix th:

    @* 不会被当作Tag Helper处理 *@
    <xfh content="haha">customer tag helper</xfh>
    <th:xfh content="tagHelperPrefix"></th:xfh>

Partial View

Partial view,局部视图是一个Razor文件,它通常嵌套在另一个Razor文件中。局部视图主要用于拆分大的Razor文件及代码复用。但请注意:

  • 局部视图不应用来维护公共布局中的内容,考虑使用_Layout.cshtml来维护公共布局

    Partial views shouldn't be used to maintain common layout elements.

  • 尽量不要在局部视图中使用复杂的渲染逻辑,或者需要执行一些代码片段才能获取到视图元素。这种情况考虑使用view component来替代局部视图。

    Don't use a partial view where complex rendering logic or code execution is required to render the markup.If you need to execute code, use a view component instead of a partial view.

声明局部视图

局部视图名通常以下划线_开头,下划线主要用于易于辨识局部视图文件。注意一点,在渲染局部视图时,不会执行_ViewStart.cshtml文件中的代码。其余与普通视图一样。

⚠️局部视图中定义的section只对当前局部视图可见

使用局部视图

引用局部视图文件而不带扩展名cshtml时,在MVC框架中,会从以下路径中加载局部视图文件,优先级从上而下依次降低:

  1. /Areas/<Area-Name>/Views/<Controller-Name>

  2. /Areas/<Area-Name>/Views/Shared

  3. /Views/Shared

  4. /Pages/Shared

当引用局部文件带上扩展名时,局部视图文件必须和引用方位于相同目录下。

可使用以下方式引入局部视图:

  <partial name="partial.cshtml" model="Model"/>
@* 局部视图文件后缀可以省略,如: *@
<partial name="partial" />
@* 也可以使用局部视图文件全名,如: *@
<partial name="~/Views/Shared/_PartialName.cshtml" />
  • HTML Helper

    @await Html.PartialAsync("_PartialName")

也可以使用 RenderPartialAsync方法来渲染局部视图,该方法直接将渲染结果写入到response中,而不是返回 IHtmlContent,所以只能在Razor代码块中调用该方法:

@{
await Html.RenderPartialAsync("_PartialName");
}

相比于PartialAsyncRenderParatialAsync有着更好的性能。

View Component

View component,视图组件和局部视图类似,但它更强大。一个视图组件包含两部分:ViewComponent类和一个视图。

视图组件不使用模型绑定,视图组件中所用的数据有调用者提供。视图组件有以下特点:

  • 渲染数据块而非整个响应

  • 关注点分离、易于测试

  • 可以有参数和业务逻辑

    MVC本身就提倡关注点分离,所以,视图组件中应尽可能只包含与渲染视图相关的逻辑

  • 通常在层中调用

自定义视图组件

创建视图组件类:

  • 视图组件继承自ViewComponent或使用ViewComponentAttribute特性

  • 自定义类约定以ViewComponent结尾(非强制)

public class FirstViewComponent : ViewComponent
{
// 方法名InvokeAsync是基于约定的,同步方法名为Invoke
public async Task<IViewComponentResult> InvokeAsync(string descript)
{
return View<string>(descript);
}
}

⚠️ 视图组件类中可以使用依赖注入。需注意:视图组件不会参与到Controller的生命周期中,所以filter对它无效。

创建视图文件:

视图组件默认视图名为:Default,简单定义视图内容如下:

<label>
@Model
</label>

在运行时按照以下顺序搜索视图文件:

  • /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}

ASP.NET Core MVC 视图的更多相关文章

  1. ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...

  2. ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 视图引擎(Razor)简介 ASP.NET Core MVC 视图(Razor)ViewData使用示例 ASP.NET Core MV ...

  3. ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...

  4. ASP.NET Core 入门笔记6,ASP.NET Core MVC 视图传值入门

    摘抄自:https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc-view-renderdata.html 如有侵权请告知 一.前言 1.本教 ...

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

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

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

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

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

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

  8. ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览

    原文:Overview of ASP.NET Core MVC 作者:Steve Smith 翻译:张海龙(jiechen) 校对:高嵩 ASP.NET Core MVC 是使用模型-视图-控制器(M ...

  9. ASP.NET Core MVC 概述

    https://docs.microsoft.com/zh-cn/aspnet/core/mvc/overview?view=aspnetcore-2.2 ASP.NET Core MVC 概述 20 ...

随机推荐

  1. Java 中的四种引用类型(转)

    目录 背景 简介          1. 强引用 StrongReference          2. 弱引用 WeakReference          3. 软引用 SoftReference ...

  2. ORACLE DATABASE 10g EXPRESS EDITION LICENSE AGREEMENT

     启动Tomcat之后出现全是英文错误: ORACLE DATABASE 10g EXPRESS EDITION LICENSE AGREEMENT To use this license, yo ...

  3. SAP采购寄售业务操作步骤

    [转自 http://blog.sina.com.cn/s/blog_6466e5f70100jghg.html] 这里所示的是比较完整的步骤,包含了:信息记录.采购合同.货源清单.采购申请.采购订单 ...

  4. 在Linux下搭建我的世界(Minecraft)服务器

    最近薅了百度云双12的羊毛,1核2G一年150.突然想起以前大学整个宿舍通宵开黑挖泥土的岁月,所以刚好趁着这台服务器,打算自己搭建一个我的世界服务器,重温一下以前的感觉. 超详细Linux搭建Java ...

  5. html5/CSS3鼠标滑过图片特效插件

    在线演示 本地下载

  6. 20145239 杜文超《Java程序设计》课程总结

    <每周读书笔记链接汇总> 第一周读书笔记:http://www.cnblogs.com/dwc929210354/p/5247666.html 第二周读书笔记:http://www.cnb ...

  7. log4net 初步使用

    自从知道了log4net之后,就一直使用的它,一直没有问题,最近由于项目变动,便将一部分的代码分离出来,然后咋UI项目中调用loghelper,便发现在本地测试一切正常,可是发布到服务器之后便不正常了 ...

  8. oracle数据库用户创建删除以及数据导入

    dmp文件的导入:1.首先,先创建表空间与用户--创建表空间create tablespace CCFOCUS01datafile 'D:\app\Administrator\oradata\orcl ...

  9. iOS Assertion failure in -[UITableView _classicHeightForRowAtIndexPath:]

    Assertion failure in -[UITableView _classicHeightForRowAtIndexPath:], /SourceCache/UIKit_Sim/UIKit-3 ...

  10. C++ string的查找函数和npos特殊值

    STL中的string有6个查找函数: 1.find() 2.rfind() 从最后一个字符开始往前找. 3.find_first_of() 4.find_not_first_of() 5.find_ ...