在MVC 视图中我们经常遇到一些html 扩展方法, 对于初次接触 MVC 的朋友们,可能容易产生混淆,甚至不明白它们之间的区别,以下是笔者在实际的开发项目中,对这些容易产生混淆的 扩展方法进行了总结,主要包括:
Html.ActionLink(), Html.Action() , Html.RenderBody(), Html.RenderSection(), Html.RenderAction(), Html.Partial(),
Html.RenderPartial(), Url.Action(), Url.Content()
Html.ActionLink()有五个重载函数
其中的参数依次表示为: linkText actionName, controllerName, routeValue, htmlAtributes
默认控制器为当前页面的控制器
它会生成一个超连接 <a href="controllerName/actionName">linkText</a> 的标签
routeValue 参数 可以对action设置参数 比如要生成这个一个标签 <h href="localhost/book/detail?isbn=123244" class ="b">aaa</a>
那么 对应的 ActionLink 就是 Html.ActonLink("aaa", "detail,", "book", new { isbn="123244"}, new { @class="b"})
因为class 是关键字, 要加转义符 @
HTML.ActionLink 和 Url.Action 的区别 :
1.html.ActionLink生成一个<a href=".."></a>标记。而Url.Action只返回一个url
2.Html.Action可以执行一个控制器的action
Html.RenderBody() 和 Html.RenderSection() 区别:
@RenderBody():呈现子页的主体内容
@RenderSection():呈现特别的节部分。其中有两个参数, 第一个参数是节点的名称, 第二个参数是一个bool 类型, 表示是否是必须的, 默认是true必须覆写,设为false则为可选覆写;
1、Action 、 RenderActionAction
相同点:
加载方法的视图,执行Controller → Model → View的顺序,然后把产生的页面带回到原来的View中再回传。
需要创建相应的 Child Action 方法
都可以缓存partial view
当数据显示在部分视图是独立于相应的视图模型的操作方法是有用的。例如:在一个博客上显示每个网页的分类列表,我们想用行动方法从类别列表是由不同的模型。
不同点:
Acton()
1.有返回值,结果直接展示为HtmlString (HTML-encoded 字符串展示) .
2.返回字符串,可以存储在变量里.
RenderAction()
1.没有返回值,执行结果会直接写入当前响应的数据流中
2.这个方法比action方法快,基于第一条原因
2、Partial() 、 RenderPartialPartial() 的区别
相同点:
1. 都可以适当的地方呈现子视图
2. 参数可以写成部分视图的名称, 或者部分视图的相对路径,
如果直接写部分视力的名称,那么部分视图必须放在调用者同一目录下,也可以放在View/Shared中。
不同点:
RenderPartial()
1.该方法没有返回值 ,即以void 的形式返回子视图,可以直接被呈现
2.该法会直接将结果写入到当前请求的http response数据流中,这意味着它使用了和当前webpage/template使用的相同的TextWriter对象
3. 不需要创建action,使用简单
4. 如果和partial view 对应的view model中,已经存在了partial view展示所需数据,RenderPartial方法会很有用.For example :blog中,显示一篇文章和它的评论, RenderPartial 方法会是比较好的选择,既然文章的评论信息已经存在在view model中
5.这个方法比partial 方法更快,因为它直接将结果系统到当前响应的数据流中
6.在Razor视图中语法不一样:
@{ Html.RenderPartial("PartialViewName"); }
Partial()
1. 方法以字符串的形式返回子视图,可以直接被呈现。 返回结果以HTML-encoded 字符串展示
2. Partial输出到临时变量StringWriter ;RenderPartial输出到HtmlHelper.ViewContext.Writer上(即直接输出到Response)。
Html.Partial内部实现
3. 因返回的是string类型,所以结果可以存储在变量里.
4. 使用简单,无需创建action
5.Partial() 当用于显示数据的部分视图已在相应的视图模型中时,这个方法是有用的。例如:在一个博客展示一篇评论,我们想用RenderPartial() 方法由于评论文章信息已经存在于视图模型,而选择使用Partial()。
6、Razor视图中语法不一样:
@Html.Partial("PartialViewName")
Html.Action与Url.Action的区别
1.Html.Action返回的指向指定控制器指定action的超链接标签<a>标签.如果没有指定controller,则默认为本页面对应的Controller.
如<%:Html.Action("Get","Book") %>
返回<a href="/Book/Get"></a>
2.Url.Action返回的是指定控制器指定action的完整URL地址
<form name="form1" action="@Url.Action("Get","Book")" method="post">
<a href="@Url.Action("GetDetail","Book",new{id=Model.ID})">@Model.Title</a>
@Url.Action("GetDetail","Book",new{id=Model.ID})返回\Book\GetDetail?id=5
Url.Content()
是将虚拟路径转换成应用程序的绝对路径, 比如在布局页中加入了css 引用, 而这具布局视图又被不同的视图引用,为了使各个视图能够正确加载 css, 需要在布局页中将虚拟路径转换成应用程序的绝对路径。
RenderPartial 和RenderAction的不同点:
1.RenderPartial的数据来自调用的View ,而RenderAction来自自己。
2.RenderAction会发起一个新的Request,而RenderPartial不会。
对于RenderPartial 和RenderAction 这两个方法如何选择:
根据两者不同点中的第二点,由于RenderAction会调用一个新的Action方法,而asp.net MVC中的Action是最小的缓存单位,因此如果某一个块的数据比较固定,不会因为访问者的不同而发生变化,那么这时就是使用RenderAction的时候了。