MVC部分视图的使用(Html.Partial/RenderPartial、Html.Action/RenderAction、RenderPage)
ASP.NET MVC 里页面往往会有许多重用的地方,可以进行封装重用。
使用部分视图有以下优点: 1. 可以简写代码。 2. 页面代码更加清晰、更好维护。
在视图里有多种方法可以 加载部分视图,包括: Partial() 、RenderPartial() 、 Action() 、RenderAction() 、 RenderPage() 方法
一、Partial与RenderPartial
1.Razor 语法: @Html.Partial() 与 @{Html.RenderPartial();}
2.区别:Partial 可以直接输出内容,它内部是将 html 内容转换为 string 字符(MVCHtmlString)(进行Html编码),然后缓存起来,最后在一次性输出到页面。显然,这个转换的过程,会降低效率,所以通常使用 RenderPartial 代替。 这两者都只是抓取分部视图页面内容,不能执行分部视图方法,所以用Partial或RenderPartial方法来显示分部视图不用建立对应的Action,因为不走Action.
二、Action与RenderAction
1.Razor 语法:@Html.Action()与@{Html.RenderAction();}
2.区别:Action 也是直接输出,和 Partial 一样,也存在一个转换的过程。不如 RenderAction 直接输出到当前 HttpContext 的效率高。
除此之外,Action与Partial相比,Action访问了控制器中的Action,执行了Action内部的业务。
2.区别:Action 也是直接输出,和 Partial 一样,也存在一个转换的过程。不如 RenderAction 直接输出到当前 HttpContext 的效率高。
除此之外,Action与Partial相比,Action访问了控制器中的Action,执行了Action内部的业务。
三、RenderPage
1.Razor语法:@RenderPage()
2.区别:也可以使用 RenderPage 来呈现部分,但它不能使用 原来视图的 Model 和 ViewData ,只能通过参数来传递。而 RenderPartial、RenderAction 可以使用原来视图的 Model 和 ViewData。@RenderPage也并没有执行Action。
2.区别:也可以使用 RenderPage 来呈现部分,但它不能使用 原来视图的 Model 和 ViewData ,只能通过参数来传递。而 RenderPartial、RenderAction 可以使用原来视图的 Model 和 ViewData。@RenderPage也并没有执行Action。
不传参的情况
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> <h3>我是首页</h3> <section> <h4>分部视图</h4> @RenderPage("~/Views/Templates/Partial1.cshtml") </section> </div> </body> </html>
传参的情况 获取 RenderPage() 传递过来的参数--(@PageData["param"]
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> <h3>我是首页</h3> <section> <h4>分部视图</h4> @RenderPage("~/Views/Templates/Partial1.cshtml",new { param1="longxi",param2="男"}) </section> </div> </body> </html>
Partial1.cshtml
@{ var param = string.Format("{0}-{1}", PageData["param1"], PageData["param2"]); } @Html.Raw(param)
四、RenderBody
在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Layout.cshtml)放在了共享视图文件夹中。在这个页面中,会看到标签里有这样一条语句:
@RenderBody()
其实它的作用和母版页中的服务器控件类似,当创建基于此布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过布局页面的@RenderBody()方法呈现在标签之间。
这个方法不需要参数,而且只能出现一次。
五、RenderSection 模板页预设区域
在模板页中加入@RenderSection(“head”),使用模板页的页面需加入@section标记
@section Head{ <script type="text/javascript"> $(function () { alert("hello jquery"); }); </script> }
则:使用模板页的页面RenderSection(“head”)位置变成以上。
@RenderSection()还有一个重载方法参数为bool类型如果为true则必须有相应的@section,如果为false则不必须有。
如果为true则配合IsSectionDefined()使用
@{
if (IsSectionDefined("SectionB"))
{
@RenderSection("SectionB")
}
}
第一个重载方法也要配合IsSectionDefined()使用
demo:
开始渲染Section
声明方式1(推荐):SectionA:<br />
@RenderSection("SectionA", false)
声明方式2:SectionB:<br />
@{
if (IsSectionDefined("SectionB"))
{
@RenderSection("SectionB")
}
}
渲染Sction结束
要么生,要么死