Partial 和RenderPartial:
這兩個的性質都是一樣, 只指把一個個View給鑲入進來, 只是回傳值有點不一樣
Partial 回傳的一個Object (MvcHtmlString), 回傳一個String 把一堆Html給回傳出來, 然后寫進到主頁面上
@Html.Partial("ViewName")
RenderPartial 回傳的是void, 而這個方法會在主頁面上添加指定的View
@{
Html.RenderPartial("ViewName");
}
這兩個方法沒有用到Controller, 是直接把一個View(Page) 給加進來
而RenderAction 有點不一樣, 這是一個Action, 所以會用到Controller 之后再回傳一個頁面
public class ChildActionOnlyTestController : Controller
{
[ChildActionOnly]
public ActionResult GetSupplierList()
{
var controller = new SupplierController();
return controller.SupplierList();
}
}
RenderPartial和RenderAction兩者的相同點
通常都被用來顯示一個功能相對獨立的“塊”,比如說顯示菜單或者導航條。 兩者輸出的結果都被作為調用的View的一部分顯示。
兩者的不同點
- RenderPatial的數據來自於調用的View,而RenderAction來自自己。
- RenderAction會發起一個新的Request,而RenderPatial不會。
@Html.Partial/@{Htmt.RenderPartial()}
@Html.Partial用於將分部視圖渲染為字符串
@{Html.RenderPartial}將分布視圖直接寫入響應輸出流,所以只能直接放在代碼塊中,不能放在表達式中(返回值是void)
RenderPartial因為是直接寫在響應流中,所以性能會更好(微量影響),而Partial不用寫在代碼塊中,所以更方便
@Html.Action()/@Html.RenderAction()
和Partial與RenderPartial類似,但是因為會通過Action,所以更靈活,可以利用控制器上下文。
在Action中可以通過IsChildAction來判斷是被Url直接調用還是被Action()/RenderAction()調用
可以利用重載直接參數給Action。
RenderAction優先使用ActionNameAttribute。
Action中使用return PartialView()指定分部視圖,在_ViewStatrt.cshtml中指定的Layout會無效。
4種PartialView對比:
PartialView:<div>Just a PartialView Test!@ViewBag.Test</div> @ViewBag.Test
View:<p> @{Html.RenderPartial("ViewUserControl1");} @Html.Partial("ViewUserControl1") @{Html.RenderAction("ViewUserControl1");} @Html.Action("ViewUserControl1") </p>
Controller:Controller: [ChildActionOnly]//防止直接調用 public ActionResult ViewUserControl1() { ViewBag.Test = "(Action)調用"; return PartialView(); }
效果: