在 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>
标记中,而现代的脚本则会出现在页面的最后,页面的内容当然出现在页面的主体中了。这样的话,我们在内容页面的实际内容,将会需要在布局的不同部分进行呈现,而不是在同一个位置进行呈现了
www.yztrans.com
解决的办法就是分区,实际上,类似于 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 www.wx-jr.com
先看分部视图,分部视图不依赖于 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 来处理雅思答案 www.tygj123.com
子 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")
相关文章
- 10-08asp.net MVC中如何用Membership类和自定义的数据库进行登录验证
- 10-08调试mvc3视图时获取当前生成的html
- 10-08关于 Rails 生成 PDF 时,markdown 中的图片链接如何处理
- 10-08qt 关于Qt中MVC的介绍与使用
- 10-08关于使用JPA中@Query注解传递表名/视图名参数的问题
- 10-08关于Spring mvc注解中的定时任务的配置
- 10-08关于手机游戏客户端中mvc框架的讨论
- 10-08ASP.NET MVC做的微信WEBAPP中调用微信JSSDK扫一扫
- 10-08.net MVC中ActionResult可以返回的视图
- 10-08ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中