在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据。

从控制器到视图

通常,在 Controller 中,我们定义多个 Action ,每个 Action 的返回类型一般是 ActionResult,在 Action 处理的最后,我们返回对于视图的调用。

public ActionResult Index()
{return this.View();
}

默认情况下,将会调用与 Action 同名的视图,比如,在上面的 Action 中,将会使用名为 Index 的视图。

如果我们传递了一个字符串参数,那么,这个字符串就回被视为视图的名称,例如,我们希望使用名为 IndexView 的视图进行呈现,那么,可以如下完成。

public ActionResult Index()
{return this.View("IndexView");
}

布局与视图

MVC 会直接去找我们的视图吗?不会!

从 Action 返回之后,首先,MVC 会在 Views 文件夹下查看是否存在一个名为 _ViewStart.cshtml 的特殊文件,如果存在的话,就回执行这个文件。

默认情况下,这个文件的内容如下所示:

@{Layout = "~/Views/Shared/_Layout.cshtml";
}

也就是说,它设置了我们的默认布局使用那一个文件文件。

布局等价于我们在 WebForm 中所使用的母版页。

如果没有这个文件,默认没有使用布局。

如果有了这个文件,而我们在页面中不想使用这个布局怎么办呢?很简单,在页面中设置 Layout = null 来覆盖掉它。

@{Layout = null;
}

布局中的分区

在布局页面中,默认就回存在一个特殊的指令 @RenderBody(),这是说,你在内容页面中呈现的内容,将会在这里进行输出。这就是在使用布局之后,你会发现你的视图中已经没有了 <html> 标记的原因。

<body>@RenderBody()
</body>

假如说,我们希望在布局中的多个位置进行输出,比如,样式表通常在 <head> 标记中,而现代的脚本则会出现在页面的最后,页面的内容当然出现在页面的主体中了。这样的话,我们在内容页面的实际内容,将会需要在布局的不同部分进行呈现,而不是在同一个位置进行呈现了。

解决的办法就是分区,实际上,类似于 WebForm 中的 ContentPlaceHolder ,定义一个命名的区域。

比如,下面我们定义了一个名为 scripts 的命名区域,第二个参数表示这个区域是可选的区域,在内容页面中可以不用提供内容。

<body>@RenderBody()@RenderSection("scripts", required: false)
</body>

而在我们的内容视图中,默认所有的内容都是填充到布局页面中的 RenderBody 部分。

如果不是的话,就可以在内容页面中,通过 @section 区域名称{ } 的方式来定义准备输出到对应区域中的内容了。

@section scripts{<script type="text/javascript">var i = 0;</script>
}

分部视图

如果我们的页面比较复杂,在同一个视图中定义输出的内容会导致页面非常复杂,通过将页面划分为多个比较独立的组成部分,可以将一个复杂的页面拆分为多个子部分来呈现。比如页面的标题部分,页面的菜单,页面的脚注部分等等。在 WebForm 中,解决这个问题的技术称为用户控件,在 MVC 中由两个技术来解决:分部视图和子 Action。

先看分部视图,分部视图不依赖于 Action ,只能嵌入到其他独立视图中使用,你可以直接在视图文件夹中创建分部视图。

在使用分部视图的页面中,使用 RenderPartial 方法调用分部视图。

Html.RenderPartial("ProductSummary");

分部视图与主视图共享所有的数据,比如模型,ViewData,ViewBag 等等,这些数据可以直接在分部视图中使用。

如果希望分部视图使用不同的模型对象,简化分部视图中的数据复杂度,也可以直接传递一个模型对象过去。

Html.RenderPartial("ProductSummary", p);

这里的第二个参数,将会在分部视图中当在模型对象来使用。

需要注意的是 RenderPartial 方法的返回类型是 void,它会将输出的内容直接输出到回应的输出流中。所以在使用上面语句的时候,不能直接嵌入到页面中,需要放在一个 @ { } 语句中,如下所示。

@{Html.RenderPartial("ProductSummary", p);
}

如果你不喜欢这样的语法,而希望直接嵌入到页面中,也可以使用 Html.Partial 方法来呈现,区别是这个方法返回呈现的 Html 片段,而不是直接输出到输出流中。

@Html.Partial("ProductSummary", p)

子 Action 问题

由于分布视图没有处理能力,只能继承主页面的数据进行呈现,如果需要有处理能力,怎么办呢?在 WebForm 中,我们可以使用 Server.Execute  来嵌入其它处理程序的输出内容,在 MVC 中,我们使用子 Action 来处理。

子 Action 就是用户不能直接访问,只能在其他的 Action 中访问的 Action 方法,它与普通的 Action 一样,有 Action 方法,还有这个 Action 对应的视图。

我们使用特性 ChildActionOnly 来说明这是一个子 Action。

[ChildActionOnly]
public string Menu()
{return "Hello, from NavController";
}

如果用户直接请求这个子 Action ,那么,系统会返回一个错误信息。

操作“menu”只能由子请求访问。

在其它视图中,可以使用 RenderAction 来访问子 Action,类似于 RenderPartial 方法,这个方法直接将内容输出到输出流中,由于它们的返回类型都是 void ,所以需要使用 @{} 来使用。

@{ Html.RenderAction("Menu", "Nav"); }

同样,使用 Action 则可以直接返回一个 Html 片段,就不用使用一个 @{ } 了。

<!--  Action -->
@Html.Action("Menu", "Nav")

转载于:https://www.cnblogs.com/haogj/p/3533377.html

关于 ASP.NET MVC 中的视图生成相关推荐

  1. 007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】

    索引: 目录索引 Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Ch ...

  2. ASP.NET MVC 3: Razor视图引擎中 @: 和text 语法【转载】

    ASP.NET MVC 3: Razor视图引擎中 @: 和<text> 语法[转载] (文章没翻译:建议大家读英文原文,看不懂查着看,顺便提高自己的英语水平!) In today's p ...

  3. asp.net mvc 中的部分视图

    使用方法:@Html.Action(action, controller) 加载局部页面. 例如在模板页中使用:@Html.Action("Contact", "Comp ...

  4. 通过源代码研究ASP.NET MVC中的Controller和View(二)

    通过源代码研究ASP.NET MVC中的Controller和View(一) 在开始之前,先来温习下上一篇文章中的结论(推论): IView是所有HTML视图的抽象 ActionResult是Cont ...

  5. ASP.NET MVC中你必须知道的13个扩展点

         ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...

  6. Asp.Net MVC中的RenderPartial 和 RenderAction 【转】

    在Asp.Net MVC中要实现某个功能可以通过许多种方式,今天我们就来讨论下使用RenderPartial和RenderAction在视图中呈现部分内容之间的区别. 比如我们要呈现如下的图所示的内容 ...

  7. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

  8. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  9. 如何在 ASP.NET MVC 中集成 AngularJS

    介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...

最新文章

  1. 零基础linux安装hadoop步骤,hadoop的Linux下简单安装步骤
  2. c语言编写程序x的y次方,C语言变为编程y = x-x立方/ 3! + x五次方力量/ 5! -x7th power / 7!...
  3. spring mvc DispatcherServlet详解之前传---前端控制器架构
  4. Project Chameleon Work In Progress 11
  5. java中compare语句的用法_Java RuleBasedCollator compare()用法及代码示例
  6. spring的applicationContext.xml如何自动加载
  7. 如何处理会话等待事件与ORA-21780故障
  8. jQuery 学习笔记 事件委派
  9. SQL PASS西雅图之行——University of Washington篇
  10. [渝粤教育] 西南科技大学 作物生产新理论与新技术 在线考试复习资料
  11. Linux下socket-文件传输
  12. 读书-算法《程序设计导引及在线实践》-简单计算题4:填词
  13. 论文参考文献格式写法
  14. 悼念《人月神话》作者 Fred Brooks
  15. java中sof是什么意思_SOF是什么意思
  16. linuxptp分析
  17. 美团大众点评合并:背后技术力量的对比回顾【转载+整理】
  18. 滴滴2023秋招笔试 老张的美数课 (C++ DP)
  19. 年轻人租房大数据报告(人群画像).pdf
  20. QT C2220: 警告被视为错误 - 没有生成“object”文件

热门文章

  1. [react] 在react中什么是合成事件?有什么用?
  2. React开发(215):React中的Fragments的动机
  3. 前端学习(3187):ant-design的button介绍按钮属性
  4. 工作121:[““]进行变量赋值
  5. 前端学习(1522):vue-cli创建项目
  6. 前端学习(312):高度塌陷
  7. java面试题30:牛客 下列哪项不属于jdk1.6垃圾收集器?
  8. 第五十四期:MongoDB与MySQL:如何选择
  9. 二维数组排序 行与列分别升序_6个经典排序技巧,尤其是最后一个,绝对的个性化...
  10. ligergrid 奇偶行效果_怎么护发才是真的有效果的?