asp.net MVC 4.0中总结 视图里加载部分视图几种方法
@RenderPage()
但它不能使用 原来视图的 Model 和 ViewData ,只能通过参数来传递。
1 @RenderPage("~/Shared/Component/Dialog.cshtml", new { title = "Hello world!", content="Nani" })
分部视图接收数据通过Page
1 <div id="dialog" title="@Page.title" style="display: none;"> 2 <p> 3 @Page.title 4 </p> 5 </div>
@Html.Partial()
用于将分部视图渲染为字符串
@Html.Partial("_PartialPage1",model,ViewData)直接返回MvcHtmlString填充
1 @Html.Partial("Component/Dialog", null, new ViewDataDictionary { { "title", "Hello world!" }, { "content", "Nani?" } })
Razor子视图里使用 ViewBag 来获取传递的数据
1 <div id="dialog" title="@ViewBag.title" style="display: none;"> 2 <p> 3 @ViewBag.content 4 </p> 5 </div>
传递强类型到部分视图
1 @{ 2 var args = new Dictionary<string,string>(); 3 args["redirectController"] = "Admin"; 4 args["redirectAction"] = "User"; 5 } 6 @Html.Partial("_childPartial",args)
_childPartial.cshtml
1 @model Dictionary<string,string> 2 <div>@Model["redirectController"]</div> 3 <div>@Model["redirectAction"]</div>
@RenderPartial()
将分布视图直接写入响应输出流,所以只能直接放在代码块中,不能放在表达式中(返回值是void)
RenderPartial 不需要创建 Controller 的 Action ,而 RenderAction 需要在 Controller 创建要加载的 Action。RenderAction 会先去调用 Contorller 的 Action ,最后再 呈现视图,所以这里 页面会在 发起一个链接。如果这个部分视图只是一些简单 的 html 代码,请使用 RenderPartial。 但如果这个部分视图 除了有 html 代码外,还需要 通过 读取数据库里的数据 来渲染,就必须使用 RenderAction 了,因为 它可以在 Action 里调用 Model里的 法读取数据库,渲染视图后在呈现,而 RenderPartial 没有 Action,所以无法做到。
Partial 可以直接输出内容,它内部是 将 html 内容转换为 string 字符(MVCHtmlString),然后缓存起来, 最后在一次性输出到页面。显然,这个转换的过程,会降低效率,所以通常使用 RenderPartial 代替。
@Html.Action()
实体类
1 public class Menu 2 { 3 public List<MenuItem> Items { get; set; } 4 } 5 6 public class MenuItem 7 { 8 public string Text { get; set; } 9 public string Url { get; set; } 10 }
控制器
1 public ActionResult MyMenu() 2 { 3 MvcLearn.Models.Menu m = new MvcLearn.Models.Menu(); 4 List<MvcLearn.Models.MenuItem> items = new List<MenuItem>(); 5 items.Add( new MenuItem(){ Text = "Baidu", Url = "http://www.baidu.com"}); 6 items.Add(new MenuItem() { Text = "Sina", Url = "http://www.Sina.com" }); 7 items.Add(new MenuItem() { Text = "IBM", Url = "http://www.ibm.com" }); 8 items.Add(new MenuItem() { Text = "Sohu", Url = "http://www.sohu.com" }); 9 m.Items = items; 10 return PartialView(m); 11 }
建立一个PartialView - MyMenu.cshtml
1 @model MvcLearn.Models.Menu 2 <ul> 3 @foreach(var item in Model.Items) 4 { 5 <li><a href="@item.Url">@item.Text</a></li> 6 } 7 </ul>
在页面中调用该Action生成视图:
1 @Html.Action("MyMenu")
调用Action时传入参数
1 @Html.Action("MyMenu", new { mi= new MvcLearn.Models.MenuItem(){ Text = "haha", Url =<a href="http://www.ms.com">http://www.ms.com</a>}})
@Html.RenderAction()
1 @{Html.RenderAction("MyMenu")}
Action 也是直接输出,和 Partial 一样,也存在一个转换的过程。不如 RenderAction 直接输出到 当前HttpContext 的效率高。