mvc renderaction renderpartial 雜談
Html.RenderPartial與Html.RenderAction這兩個方法都是用來在界面上嵌入用戶控件的。
Html.RenderPartial是直接將用戶控件嵌入到界面上:
<%Html.RenderPartial("LogOnUserControl");%>
或
<%Html.RenderPartial("~/Areas/Comm/Views/Shared/LogOnUserControl.ascx");%>
注意:用第一種方法時,用戶控件必須放在調用者同一目錄下,也可以放在View/Shared中。
Html.RenderAction則通過Controller中的Action來調用用戶控件
Controller:----用戶控件所在Controller
public ActionResult UserControl()
{
return PartialView();
}
View:----調用用戶控件的View
<%Html.RenderAction("UserControl","Controller");%>
個人比較喜歡用RenderPartial
What is Html.RenderPartial
Html.RenderPartial在Asp.net Mvc中是用來調用PartialView的。PartialView基本上就是Asp.net Webform中的UserControl。調用也很簡單,只要在View中把PartialView的名字作為參數傳遞就可以。比如:
<% Html.RenderPartial("YourPartialView", YourData); %>
|
YourData是一個可選的參數。如果有,那么YourData會被賦給PartialView中的Model。如果沒有,那么調用 RenderPartial的View中的Mode和ViewData會被傳遞給PartialView。也就是說,PartialView的數據來自於 調用的View。
What is Html.RenderAction
Html.RenderAction允許你直接調用某一個Action,並把返回的結果直接顯示在當前調用的View中。比如:
<% Html.RenderAction("Show", "Tag"); %>
|
此時,TagController中的Show方法會被調用。由於這時調用的是一個Action方法,因此可以在此方法中完成你想要完成的各種操作,比如從數據庫,文件等獲取數據,寫數據等並返回結果。
[OutputCache(Duration=6000)]
public
ActionResult Show()
{
var tagData =
null
;
//Get data from database
//tagData = tagService.AllHot();
return
PartialView(
"TagCloud"
, tagData);
}
|
TagCloud是一個簡單的PartialView文件而已。
兩者的相同點
RenderPartial和RenderAction通常都被用來顯示一個功能相對獨立的“塊”,比如說顯示菜單或者導航條。 兩者輸出的結果都被作為調用的View的一部分顯示。
兩者的不同點
- RenderPatial的數據來自於調用的View,而RenderPatial來自自己。
- RenderAction會發起一個新的Request,而RenderPatial不會。
如何選擇
根據兩者不同點中的第二點,由於RenderAction會調用一個新的Action方法,而Asp.net Mvc中Action是最小的緩存單位,因此如果某一個“塊”的數據比較固定,不會因為訪問者的不同而發生變化,那么這時就是使用 RenderAction的時候了。 題外話,對於RenderAction會發起一個新的Request,感覺對調用頁面的流程有點破壞。一個View在顯示的時候,自己又發起一個 Request去獲取數據來顯示,顯然有點破壞了作為一個View的原則:
A View should only know how to render, but not what to render!
ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction區別
對這四個的區別做一個總結,清理一下思路,方便以后使用:
1、帶有Render的方法 @Html.Partial 對應 @{Html.RenderPartial(....);}
@Html.Action 對應 @{Html.RenderAction(....);}2、Action、RenderAction加載方法的視圖,執行Controller → Model → View的順序,然后把產生的頁面帶回到原來的View中再回傳。而Partial、RenderPartial直接加載視圖文件內容,執行3. Html.Partial可以直接提供用戶控件名作為參數,而Html.Action需要有對應的Action,在Action內部返回PartailResult(即retun PartialView())。
4、對於簡單的沒有任何邏輯的用戶控件,推薦使用Html.Partial;對於需要設置一些Model的用戶控件,推薦使用Html.Action。當然,有Model數據也是可以使用Html.Partial方法的,可以看方法的重載。
5、使用Html.Action有個好處,就是可以根據不同的場景選擇不同的用戶控件。比如:
@Html.Action("UserInfoControl")
在對應的UserInfoControl這個Action中,在用戶未登錄的時候,可以retun PartialView("LogOnUserControl");登錄后,可以retun PartialView("UserInfoControl");
這3個HtmlHelper的擴展方法
Html.Partial:是將視圖內容直接生成一個字符串並返回,
Html.RenderPartial方法是直接輸出至當前HttpContext,
而Html.RenderAction還調用一下Action。重新執行一次Controller → Model → View的順序。
因此它們在視圖中的使用方式是不同的:
<%Html.RenderPartial("MyPartialView");%>
<%Html.RenderAction("MyPartialView");%>
<%=Html.Partial("MyPartialView")%> (相當於一個字符串)
注意:RenderPartial以<%開頭,末尾有分號。而Partial,RenderAction以<%=開頭,末尾沒有分號。這里RenderPartial,RenderAction 方法不是返回一個字符串,而是直接輸出內容到調用視圖模板的輸出流中。 方法后使用分號,否則會導致編譯器錯誤。這是因為<% %>代碼塊是一串代碼語句,在C#代碼中,需要通過分號標識語句結束。
