ASP.NET Core MVC 视图
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.cshtml和ViewStart.cshtml文件直接位于Views文件夹下:


相比其它位置的其它位置
ViewImports.cshtml和ViewStart.cshtml,直接位于Views文件夹中的ViewImports.cshtml和ViewStart.cshtml文件会优先执行后执行的
ViewImports.cshtml文件中的内容有可能会覆盖先执行ViewImports.cshtml文件中的内容ViewImports.cshtml和ViewStart.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框架中,会从以下路径中加载局部视图文件,优先级从上而下依次降低:
/Areas/<Area-Name>/Views/<Controller-Name>/Areas/<Area-Name>/Views/Shared/Views/Shared/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");
}
相比于PartialAsync,RenderParatialAsync有着更好的性能。
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 视图的更多相关文章
- ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...
- ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 视图引擎(Razor)简介 ASP.NET Core MVC 视图(Razor)ViewData使用示例 ASP.NET Core MV ...
- ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...
- ASP.NET Core 入门笔记6,ASP.NET Core MVC 视图传值入门
摘抄自:https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc-view-renderdata.html 如有侵权请告知 一.前言 1.本教 ...
- ASP.NET Core 入门教程 7、ASP.NET Core MVC 分部视图入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...
- ASP.NET Core MVC 之视图(Views)
ASP.NET Core MVC 控制器可以使用视图返回格式化的结果. 1.什么是视图 在 MVC 中,视图封装了用户与应用交互呈现细节.视图是具有生成要发送到客户端内容的,包含嵌入代码的HTML模板 ...
- ASP.NET Core 入门笔记8,ASP.NET Core MVC 分部视图入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...
- ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览
原文:Overview of ASP.NET Core MVC 作者:Steve Smith 翻译:张海龙(jiechen) 校对:高嵩 ASP.NET Core MVC 是使用模型-视图-控制器(M ...
- ASP.NET Core MVC 概述
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/overview?view=aspnetcore-2.2 ASP.NET Core MVC 概述 20 ...
随机推荐
- varnish代理缓存服务器的安装与使用
1. 下载解压 cd /usr/local/src/ wget https://codeload.github.com/varnishcache/varnish-cache/zip/master ch ...
- Python爬虫--Requests库
Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,requests是python实现的最简单易用的HTTP库, ...
- 我的Android进阶之旅------>如何在多个LinearLayout中添加分隔线
如果要适合于所有的Android版本,可以在多个LinearLayout放置用于显示分隔线的View.例如,放一个ImageView组件,然后将其背景设为分隔线的颜色或图像,分隔线View的定义代码如 ...
- CF A. DZY Loves Hash
A. DZY Loves Hash time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- MySql索引建立规则
为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引.本小节将向读者介绍一些索引的设计原则. 1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确 ...
- 使用 eslint 和 editorconfig 规范代码
项目中使用eslint 为什么使用eslint : 为了保持代码风格的统一 在做vue项目的时候, 基本上都会使用 vue-cli 脚手架去创建一个vue 项目,里面可以选择使用eslint 代码检测 ...
- struts + hibernate笔记
1.hibernate: 1) Restrictions.eq 判断是否相等== (场景:一个类A中的属性t,这个属性t是另一个类B中的ID,找出输入为这个属性t的所有类A) tasks = ses ...
- 分享知识-快乐自己:SpringMVC 底层执行原理解析
底层实现原理图: 观看底层代码: 1):打开 web.xml 文件 2):按住 Ctrl + 鼠标左键 进入底层查看源码 3):按住 Ctrl+o 找到对应的方法doDispatch 5): ...
- 关于JDK安装javac失效的几个问题。
1.按照指南一步一步配置环境变量. 打开cmd,测试. 2.如果还是没有用,注意你的JAVA_HOME配置的是用户变量还是系统变量,改成系统变量. 打开cmd,测试. 3.如果还是没有用,不要你的JA ...
- HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)
描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...