1. 什么是局部视图
局部视图是在其他视图中呈现的视图. 通过执行局部视图生成的 html 输出呈现在调用视图中. 与视图一样, 局部视图使用 .cshtml 文件扩展名. 当希望在不同视图之间共享网页的可重用部分时, 就可以使用局部视图.
2. 什么时候使用局部视图
局部视图是将大视图分成小组件的有效方法. 通用的布局元素应在 _Layout.cshtml 中指定, 非布局可重用内容可以封装成局部视图.
如果一个由几个逻辑部分组成的复杂页面, 那么将每个逻辑部分作为局部视图是很有用. 布局视图与普通视图之间没有语义差别, 它们只是以不同的方式呈现. 你可以直接从控制器的 ViewResult 返回视图, 而这个视图也可以当局部视图来用. 视图和局部视图的主要区别是呈现方式不同, 局部视图不运行 _ViewStart.cshtml, 而视图运行.
3. 引用局部视图
在视图页面中有几种方法呈现局部视图. 最简单的是使用 HTML.Partial , 它通过 @ 前缀来调用并返回 IHtmlString : @HTML.Partial("AuthorPartial").
PartialAsync 方法对包含异步代码的局部视图是可用的: @await HTML.PartialAsync("AuthorPartial") .
还可以使用 RenderPartial 方法来呈现局部视图. 这个方法不返回结果: 它将渲染结果直接输出到响应中. 正因为它不返回响应, 所以必须在 Razor 代码块中调用. 通用也有一个异步方法 RenderPartialAsync:
- @{
- HTML.RenderPartial("AuthorPartial");
- }
4. 发现局部视图
当引用局部视图时, 可以通过多种方式找到它的位置:
- // 以视图名使用当前文件夹下的视图, 如果没有找到, 则搜索 Shared 文件夹
- @HTML.Partial("ViewName")
- // 这个名称的视图必须在相同文件夹下
- @HTML.Partial("ViewName.cshtml")
- // 依据应用根路径定位视图, 以 "/" 或 "~/" 开头的路径表示应用根路径
- @HTML.Partial("~/Views/Folder/ViewName.cshtml")
- // 使用相对路径
- @HTML.Partial("../Account/ViewName.cshtml")
局部视图可以链接. 也就是说, 一个局部视图可以调用另一个局部视图 (只要不创建循环).
5. 局部视图访问数据
当局部视图被实例化时, 它获取父视图的 ViewData 字典的副本. 对局部视图中的数据所做的更新不会影响到父视图. 局部视图返回时, 局部视图中更改的 ViewData 将丢失.
你可以将 ViewDataDictionary 的实例传递到局部视图: @HTML.Partial("PartialName",customViewData) .
也可以将模型传递到局部视图:@HTML.Partial("PartialName",viewModel) .
也可以将 ViewDataDictionary 和 模型都传递到视图:@HTML.Partial("PartialName",viewModel,customViewData) .
6. 简单实战
先创建用到的模型:
- namespace MVCTest.Models
- {
- public class Article
- {
- public Article()
- {
- Sections = new List<ArticleSection>();
- }
- public string AuthorName { get; set; }
- public List<ArticleSection> Sections { get; set; }
- }
- public class ArticleSection
- {
- public string Title { get; set; }
- public string Content { get; set; }
- }
- }
然后在控制器中实例化模型:
- public class ArticleController : Controller
- {
- // GET: Article
- public ActionResult Index()
- {
- var article = new Article();
- article.AuthorName = "test";
- article.Sections.Add(new ArticleSection() { Title="title",Content="content"});
- return View(article);
- }
- }
父视图:
- @model MVCTest.Models.Article
- @{
- ViewData["Title"] = "Index";
- }
- <h2>@Model.AuthorName</h2>
- @HTML.Partial("AuthorPartial",Model.AuthorName);
- @foreach (var section in @Model.Sections)
- {
- @HTML.Partial("ArticleSection", section);
- }
- AuthorPartial.cshtml:
- @model string
- <h3>@Model</h3>
- ArticleSection.cshtml:
- @model MVCTest.Models.ArticleSection
- <h3>@Model.Title</h3>
- <h2>@Model.Content</h2>
来源: https://www.cnblogs.com/afei-24/p/11293991.html