asp.net core系列 42 Web 应用 分部视图
一.分部视图
对于MVC 视图和 Razor Pages 页面,都有分部视图功能。通常将 MVC 视图和 Razor Pages 页面统称为“标记文件”,下面会常提到该名词。使用分部视图的优势包括:(1) 将大型标记文件分解为更小的组件。(2) 减少跨标记文件中,常见标记内容的重复。
建议:(1)不应使用分部视图来维护常见布局元素,常见布局元素应在 _Layout.cshtml 文件中指定,比如页头、页尾。(2)当需要呈现复杂逻辑或代码执行的应该使用视图组件。
1.1 声明分部视图
分部视图是在 Views 文件夹 (MVC) 或 Pages 文件夹 (Razor Pages) 中维护的 .cshtml 标记文件。在 ASP.NET Core MVC 中,控制器的 ViewResult 能够返回视图或分部视图。 在 ASP.NET Core 2.2 中 Razor Pages 的PageModel 可以返回 PartialViewResult分部视图。
分部视图不会运行 _ViewStart.cshtml页,这涉及到布局以后再讲。分部视图的文件名通常以下划线 _ 开头,没有.cshtml.cs文件。
1.2 引用分部视图
在标记文件中,有多种方法可引用分部视图。 建议应用程序使用以下异步呈现方法之一:(1) 分部标记帮助程序。(2) 异步 HTML 帮助程序。 不建议使用同步HTML 帮助程序, 因为可能会出现死锁的情况, 同步方法以后版本中会删除,这里不再介绍。
(1) 分部标记帮助程序
分部标记帮助程序会异步呈现内容,并使用类似 HTML 的语法:
<partial name="_PartialName" />
当存在文件扩展名时,标记帮助程序会引用分部视图,该视图必须与调用分部视图的标记文件位于同一文件夹中:
<partial name="_PartialName.cshtml" />
以下示例从应用程序根目录引用分部视图。 以 (~/) 或 (/) 开头的路径,指代应用程序根目录:
Razor 页面CSHTML
<partial name="~/Pages/Folder/_PartialName.cshtml" />
<partial name="/Pages/Folder/_PartialName.cshtml" />
MVC CSHTML
<partial name="~/Views/Folder/_PartialName.cshtml" />
<partial name="/Views/Folder/_PartialName.cshtml" />
使用相对路径的分部视图
<partial name="../Account/_PartialName.cshtml" />
(2) 异步 HTML 帮助程序
使用 HTML 帮助程序时,最佳做法是使用 PartialAsync,同步是使用Partial(不建议使用同步)。PartialAsync 返回包含在 Task<TResult> 中的 IHtmlContent 类型。通过@await来引用该方法。
Razor 页面CSHTML
@await Html.PartialAsync("~/Pages/Folder/_PartialName.cshtml")
@await Html.PartialAsync("/Pages/Folder/_PartialName.cshtml")
mvc CSHTML
@await Html.PartialAsync("~/Views/Folder/_PartialName.cshtml")
@await Html.PartialAsync("/Views/Folder/_PartialName.cshtml")
也可以使用 RenderPartialAsync 呈现分部视图。 此方法不返回 IHtmlContent。它将呈现的输出,直接流式传输到响应, 因此在某些情况下它可提供更好的性能。 因为该方法不返回结果,所以必须在 Razor 代码块内调用它:
@{
await Html.RenderPartialAsync("_AuthorPartial");
}
1.3 分部视图发现
如果按名称(无文件扩展名)引用分部视图,则按所述顺序搜索以下位置:
(1) Razor 页面
1.当前正在执行页面的文件夹
2.该页面文件夹上方的目录图
3./Shared
4./Pages/Shared
5./Views/Shared
(2) MVC
1./Areas/<Area-Name>/Views/<Controller-Name>
2./Areas/<Area-Name>/Views/Shared
3./Views/Shared
4./Pages/Shared
1.4 通过分部视图访问数据
实例化分部视图时,它会获得父视图(主视图)的 ViewData 字典的副本。 在分部视图内,对数据所做的更新不会保存到父视图中。 对分部视图中的 ViewData 更改,会在分部视图返回时丢失。
以下示例演示如何将 ViewDataDictionary(ViewData 字典)的实例传递给分部视图:
@await Html.PartialAsync("_PartialName", customViewData)
还可将模型(实体对象)传入分部视图。 模型可以是自定义对象。
@await Html.PartialAsync("_PartialName", model)
二. 演示
下面演示一个Razor的分部视图(MVC的参考官网示例)。示例中Pages/ArticlesRP/ReadRP.cshtml是主视图,Pages/Shared/_AuthorPartialRP.cshtml是第一个分部视图,传入“作者”。Pages/ArticlesRP/_ArticleSectionRP.cshtml 是第二个分部视图,传入ViewData字典和section模型二个参数,这二个参数是PartialAsync的方法重载。 三个文件结构如下:

(1) 创建实体类
public class Article
{
public string Title { get; set; } public string AuthorName { get; set; } public string PublicationDate { get; set; } public List<ArticleSection> Sections { get; set; }
} public class ArticleSection
{
public string Title { get; set; }
public string Content { get; set; }
}
(2)主视图
public class ReadRPModel : PageModel
{
public Article Article { get; set; } public void OnGet()
{
Article = new Article()
{
Title = "来自 <共享分部视图文件路径> 的分部视图",
AuthorName = "Abraham Lincoln",
PublicationDate= "1863 年 11 月 19 日中午 12:00:00",
Sections = new List<ArticleSection>() {
new ArticleSection (){ Title="第一节索引", Content="八十七年前..." },
new ArticleSection (){ Title="第二节索引", Content="如今,我们正在进行一场伟大的内战,考验着......" },
new ArticleSection (){ Title="第三节索引", Content="然而,从更广泛的意义上说,我们无法奉献..." },
}
};
}
}
@page
@model ReadRPModel <h2>@Model.Article.Title</h2> @Model.Article.PublicationDate @* 将作者名字传到 Pages\Shared\_AuthorPartialRP.cshtml*@
<p>---------------------------------第一个分部视图/Views/Shared/_AuthorPartial.cshtml</p>
@await Html.PartialAsync("../Shared/_AuthorPartialRP.cshtml", Model.Article.AuthorName) <p></p>
@* Loop over the Sections and pass in a section and additional ViewData to
the strongly typed Pages\ArticlesRP\_ArticleSectionRP.cshtml partial view. *@
<p>---------------------------------第二个分部视图/Views/Shared/_ArticleSection.cshtml</p>
@{
var index = 0; @foreach (var section in Model.Article.Sections)
{
@await Html.PartialAsync("_ArticleSectionRP", section,
new ViewDataDictionary(ViewData)
{
{ "index", index }
}) index++;
}
}
(3) 分部视图 _AuthorPartialRP.cshtm
@* 将传过来的string类型映射*@
@model string
<div>
<h3>@Model</h3>
</div>
(4) 分部视图 _ArticleSectionRP.cshtml
@using StudyRazorDemo.Models; @* 将传过来的对象映射到ArticleSection中*@
@model ArticleSection <h3>@Model.Title Index: @ViewData["index"]</h3>
<div>
@Model.Content
</div>
<p></p>
启动程序,运行http://localhost:42921/ArticlesRP/ReadRP,显示如下:

参考资料
asp.net core系列 42 Web 应用 分部视图的更多相关文章
- asp.net core系列 41 Web 应用 MVC视图
一.MVC视图 在Web开发的MVC和Razor中,都有使用视图,在Razor中称为"页"..cshtml视图是嵌入了Razor标记的HTML模板. Razor 标记使用C#代码, ...
- asp.net core系列 40 Web 应用MVC 介绍与详细示例
一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...
- asp.net core系列 39 Web 应用Razor 介绍与详细示例
一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...
- asp.net core 系列 18 web服务器实现
一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...
- asp.net core 系列 16 Web主机 IWebHostBuilder
一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...
- asp.net core系列 44 Web应用 布局
一.概述 MVC的视图与Razor页面经常共享视觉和程序元素,通过使用布局来完成,布局还可减少重复代码.本章演示了以下内容的操作方法:(1)使用通用布局,(2)自定义布局,(3) 共享指令,(4)在呈 ...
- asp.net core系列 43 Web应用 Session分布式存储(in memory与Redis)
一.概述 HTTP 是无状态的协议. 默认情况下,HTTP 请求是不保留用户值或应用状态的独立消息. 本文介绍了几种保留请求间用户数据和应用状态的方法.下面以表格形式列出这些存储方式,本篇专讲Sess ...
- asp.net core系列 67 Web压力测试工具WCAT
一.介绍 最近搭建了一套CQRS框架,需要在投入开发前,进行必要的压力测试.Web Capacity Analysis Tool (Wcat)是一种轻量级HTTP负载生成工具,主要用于衡量受控环境中 ...
- asp.net core系列 45 Web应用 模型绑定和验证
一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数. 这些参数可能是简单类型的参数,如字符串.整数或浮点数,也可能是复杂类型的参数. ...
随机推荐
- Python Tips阅读摘要
发现了一本关于Python精通知识点的好书<Python Tips>,关于Python的进阶的技巧.摘录一些比较有价值的内容作为分享. *args and **kwargs 在函数定义的时 ...
- Linux基础命令归纳大全
Linux发行版本:基于linux内核提供桌面环境及办公套件的操作系统 (Linux内核只有一个) 1. 启动终端的快捷键: ctr + alt + t 2. 终端字体放大: ctr+shift+ ...
- 全文检索-Lucene.net
Lucene.net是Lucene的.net移植版本,在较早之前是比较受欢迎的一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎. ...
- flex调用JS报安全沙箱错误解决办法
flex调用JS方法弹窗时一般会报安全沙箱错误,只要将被调用的JS方法设置延时就可解决. function openKqQuery(){ window.showModalDialog("pa ...
- 第二章 ArrayList源码解析
一.对于ArrayList需要掌握的七点内容 ArrayList的创建:即构造器 往ArrayList中添加对象:即add(E)方法 获取ArrayList中的单个对象:即get(int index) ...
- jsp 增删改查
使用Idea创建项目 1.新建web application项目 Idea 选择 Java Enterprise -> web application 2.新版本没有web-inf文件夹 解决方 ...
- 学习Layui 第一天
Layui 官网说这是款经典模块化前端框架 个人觉得Layui很好用,容易上手. 在学习Layui的之前.先去官网下载必要的文件 将这些文件放入项目当中 然后可以到官网看一下示例. 可以做一个简单的表 ...
- Mysql-自带的一些功能,基本用法(视图,触发器,事务,存储过程,函数,流程控制)
一. 视图 二. 触发器 三. 事务 四. 存储过程 五. 函数 六. 流程控制 一 .视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用 ...
- linux内核堆栈
一:进程的堆栈 内核在创建进程的时候,在创建task_struct的同时会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存 在于内核空间.当进程在用户空间运行时,c ...
- PAT1133:Splitting A Linked List
1133. Splitting A Linked List (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...