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

在 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021-07-21

leetcode113 看了很多别人的题解&#xff0c;还是感觉没太懂&#xff0c;主要是因为dfs和bfs没彻底会用&#xff0c;还是得找专门的题练练。 得早睡早起呀&#xff0c;假期学习真就靠自律呀。 *** Definition for a binary tree node.* struct TreeNode {* int val;* …

实验项目 3-4:一元多项式的乘法与加法运算

代码如下&#xff1a; /*************************************************************************> File Name: AddPoly.c> Author: YueBo> Mail: yuebowhu163.com> Created Time: 2016年12月17日 星期六 13时00分35秒***************************************…

SQL自定义完整性

自定义完整性。&#xff08;事务&#xff09; 事务的四个特性&#xff1a; 原子性 : 事务中SQL语句是一个整体, 不可分离,要么都执行、要么都不执行 一致性 : 事务前后数据保持一致 隔离性 : 事务中不允许其他事务介入 永久性 : 事务执行之后对数据表的修改是永久的 Expectatio…

伪类和伪元素

选择第一个子元素&#xff1a;first-child li:first-child{text-decoration: underline;}li:last-child{color: red;}p:first-child{font-style: italic;} <p>xiaoren</p><ul><li>Insert Key</li><li>Turn Key<strong>clockwise<…

T-SQL存储过程

存储过程。即T-SQL里的方法。类似封装的思想。 基本语法如下&#xff1a; create proc 方法名 name 默认值可不写&#xff0c;传入的参数 数据类型 , p变量名 数据类型 output (返回值) asSql代码 go--调用上面方法 declare variable 和p一样的类型 exec 方法名 传值 , var…

Extjs4开发中的一些问题

1. 子frame刷新的问题 一般在jsp里面&#xff0c;要实现界面跳转&#xff0c;有很多方法&#xff0c;最典型的就是window.location.href"href",但是在嵌套有iframe框架的页面布局&#xff0c;使用上述语句&#xff0c;只会使iframe本身实现跳转&#xff0c;如果遇到…

TSQL索引与视图

创建视图 简化sql 代码&#xff0c;还有&#xff0c;给予权限&#xff08;只能查指定的列&#xff09; create view 视图名 as sql代码&#xff0c;不要有同名列&#xff08;只能一句sql代码&#xff09; go select * from 视图名 &#xff08;最好不要用视图做更改操作&#…

jacob 实现Office Word文件格式转换

关于jacob用法&#xff0c;百度一下就会发现几乎都是复制2004年一个代码&#xff0c;那段代码实现的是从一个目录读取所有doc文件&#xff0c;然后把它转html格式。 为了便习学习和使用&#xff0c;我把代码看懂后精简了一下&#xff0c;得出不少新结论&#xff0c;拿出来和大家…

2021-07-22

leetcode547 第一次做这种题&#xff0c;有点生&#xff0c;借鉴 class Solution { public:void dfs(vector<vector<int>>& isConnected,vector<int>&isvisited,int i){for(int j0;j!isConnected.size();j){if(isConnected[i][j]1&&isvisit…

树的同构

输入样例1&#xff08;对应图1&#xff09;&#xff1a;8A 1 2B 3 4C 5 -D - -E 6 -G 7 -F - -H - -8G - 4B 7 6F - -A 5 1H - -C 0 -D - -E 2 -输出样例1:Yes输入样例2&#xff08;对应图2&#xff09;&#xff1a;8B 5 7F - -A 0 3C 6 -H - -D - -G 4 -E 1 -8D 6 -B 5 -E - -…

.Net 中的封装知识点

c # 中的封装 1&#xff0c;类与对象 生活中现有对象&#xff0c;然后人们先对其归类。 而程序中&#xff0c;先有类&#xff0c;再有对象。有了这些类&#xff0c;才能生成实际的对象&#xff0c;即类的实例化。&#xff08;类名new 一个对象&#xff09; 对象是从类里那东西的…

[家里蹲大学数学杂志]第236期钟玉泉复变函数论前六章第二组习题参考解答

第一章 复数与复变函数 1将复数 $$\bex \frac{(\cos5\varphii\sin 5\varphi)^2}{(\cos3\varphi-i\sin 3\varphi)^3} \eex$$ 化为指数形式. 解答: 由 Euler 公式, $$\bex \mbox{原式}\frac{(e^{i5\varphi})^2}{(e^{-i3\varphi})^3} e^{i[10\varphi-(-9\varphi)]}e^{19\varphi…

思想

思想是自由的&#xff0c;鞭策和束缚下的思想不会深刻&#xff0c;所以不要强迫自己去思考和学习&#xff0c;除非你在那里找到了乐趣&#xff1b; 思想是懒惰的&#xff0c;稍不留神就可能走入邪道&#xff0c;或者呼呼的在那里享受睡觉&#xff1b; 所以最好的办法是&#…

.Net 中的继承知识点

.Net 中的面向对象 继承 继承思想的应用是为了解决封装遗留下来的代码冗余的问题。但这是简单的理解。 在一个系统开发中会有重复的成员&#xff0c;所以找到这些共有的成员&#xff0c;把它们装进一个类中&#xff0c;即父类。 语法 A:B A类继承了B,B 是父类。 A类可访问B类中…

Java单例模式简单实现

代码 public class Singleton {private static Singleton singleton;//创建一个单例对象public static Singleton getSingleton(){if(singleton null){//判断对象是否为空singleton new Singleton();}return singleton;} } public class Test {public static void main(Strin…

2021-07-23

leetcode46 第一次写回溯的题&#xff0c;思想还是dfs&#xff0c;就是多了一步恢复原状态&#xff0c;之前好像也写过。每天做的有点少&#xff0c;得加油了 class Solution { public:vector<vector<int>> permute(vector<int>& nums) {vector<vec…

firefox flash-plugin怎样安装

1&#xff0c;到adobe官网上下载Linux的tar.gz的包&#xff1b; 2&#xff0c;tar -zxvf flash_player_npapi_linux.x86_64.tar.gz&#xff1b; 3&#xff0c;sudo cp libflashplayer.so /usr/lib/mozilla/plugins/&#xff1b; 4&#xff0c;重启Firefox&#xff0c;搞定。…