一.分部视图

  对于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 中的分部视图

   

asp.net core系列 42 Web 应用 分部视图的更多相关文章

  1. asp.net core系列 41 Web 应用 MVC视图

    一.MVC视图 在Web开发的MVC和Razor中,都有使用视图,在Razor中称为"页"..cshtml视图是嵌入了Razor标记的HTML模板. Razor 标记使用C#代码, ...

  2. asp.net core系列 40 Web 应用MVC 介绍与详细示例

    一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...

  3. asp.net core系列 39 Web 应用Razor 介绍与详细示例

    一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...

  4. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

  5. asp.net core 系列 16 Web主机 IWebHostBuilder

    一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...

  6. asp.net core系列 44 Web应用 布局

    一.概述 MVC的视图与Razor页面经常共享视觉和程序元素,通过使用布局来完成,布局还可减少重复代码.本章演示了以下内容的操作方法:(1)使用通用布局,(2)自定义布局,(3) 共享指令,(4)在呈 ...

  7. asp.net core系列 43 Web应用 Session分布式存储(in memory与Redis)

    一.概述 HTTP 是无状态的协议. 默认情况下,HTTP 请求是不保留用户值或应用状态的独立消息. 本文介绍了几种保留请求间用户数据和应用状态的方法.下面以表格形式列出这些存储方式,本篇专讲Sess ...

  8. asp.net core系列 67 Web压力测试工具WCAT

    一.介绍 最近搭建了一套CQRS框架,需要在投入开发前,进行必要的压力测试.Web Capacity Analysis Tool  (Wcat)是一种轻量级HTTP负载生成工具,主要用于衡量受控环境中 ...

  9. asp.net core系列 45 Web应用 模型绑定和验证

    一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数. 这些参数可能是简单类型的参数,如字符串.整数或浮点数,也可能是复杂类型的参数. ...

随机推荐

  1. tarjan算法讲解。

    tarjan算法讲解.   全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看懂.我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关 ...

  2. Scala编程入门---面向对象编程之对象

    对象 Object,相当于class单个实例,通常在里面放一些静态的filed或method 第一次调用object方法时候,就会执行object的constructor,也就是Object中不在me ...

  3. Vimium快捷键记录

    作为一个Geek必备的技能 从今天起在这里仅记录下使用过的快捷键和心得(翻译自 ?) version: 1.59 版本不同,快捷键有所不同 1. 下载安装地址(自备梯子) Chrome商店:https ...

  4. JavaScript里面的循环方法小结

    一,原生JavaScript中的循环: for 循环代码块一定的次数,它有三个参数,来决定代码块的循环次数,第一个是初始值,第二个是终止值,第三个参数是变化规则: //for循环 for(var i ...

  5. 原生js实现canvas气泡冒泡效果

    说明: 本文章主要分为ES5和ES6两个版本 ES5版本是早期版本,后面用ES6重写优化的,建议使用ES6版本. 1, 原生js实现canvas气泡冒泡效果的插件,api丰富,使用简单2, 只需引入J ...

  6. PAT1056:Mice and Rice

    1056. Mice and Rice (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Mice an ...

  7. Spring MVC温故而知新-从零开始

    Spring MVC简介 Spring MVC是一款基于MVC架构模式的轻量级Web框架,目的是将Web开发模块化,对整体架构进行解耦. Spring MVC有一下优点: 作为Spring框架的一部分 ...

  8. tkinter中text文本与scroll滚动条控件(五)

    text与scroll控件 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("30 ...

  9. 你不知道的JavaScript--Item26 异步的脚本加载

    先来看这行代码: <script src = "allMyClientSideCode.js"></script> 这有点儿--不怎么样."这该放 ...

  10. 你不知道的JavaScript--Item6 var预解析与函数声明提升(hoist )

    1.var 变量预编译 JavaScript 的语法和 C .Java.C# 类似,统称为 C 类语法.有过 C 或 Java 编程经验的同学应该对"先声明.后使用"的规则很熟悉, ...