背景:ASP.NET MVC 4.0
Html.Partial("_ProjectDetail") 與 Html.RenderPartial("_Xxx") 使用效果有些相似, 都可以用在父級模板中,以實現MVC頁面模塊化或模塊頁面復用的效果. 發現Html.Partial("_Xxx")發現往往使用在_Layout.chtml這樣的布局模板文件中.
@Html.Partial(....)
Html.Partial()非常常用,往往用在_Layout.cshtml中,用於插入"子模板",例如 @Html.Partial("_TopNavbar") ,直接就在chmtl模板頁中這么用,無需用大括號{}包住。
public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName) { return htmlHelper.Partial(partialViewName, null, htmlHelper.ViewData); } public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData) { using (StringWriter writer = new StringWriter(CultureInfo.CurrentCulture)) { htmlHelper.RenderPartialInternal(partialViewName, viewData, model, writer, ViewEngines.Engines); return MvcHtmlString.Create(writer.ToString()); } }
請注意, Partial方法將結果輸出到臨時變量StringWriter ;
@{ Html.RenderPartial(...); }
public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName) { htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, null, htmlHelper.ViewContext.Writer, ViewEngines.Engines); }
上面是@{ Html.RenderPartial("_ArticleTable"); } RederPartial對應的方法聲明
(1).此方法內調用 htmlHelper.ViewContext.Writer 進行輸出, 通俗的理解, Html.RenderPartial方法是直接絢爛模板, 將結果直接Reponse到瀏覽器, 所以在視圖語法中需要用大括號{}”接住”RenderPartial方法的返回值. 所以又有人就這樣說:RenderXXX的方法返回值是void, 在方法內部進行輸出;
(2).強調一點, RenderPartial帶"計算"功能, 可以直接"拿到"父View中傳入的model,即不用單獨為RenderPartial傳入model, 這點在實際開發也能體會到.
(3).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。
例子參考
在Project/Detail.cshtml 中 @{ Html.RenderPartial("_ProjectDetail");}
說明:
1).Project/Detail.cshtml是項目詳細頁模板
2).在Views\Shared中創建復用的子模板_ProjectDetail.cshtml,發現它是可以拿到在ProjectController中在Detail()方法中傳入的值,在coding時需在在子模板_ProjectDetail.cshtml中引入需要的數據
_ProjectDetail.cshtml 中 @{ List<List<SelectListItem>> loadDDL = ViewBag.ddlStrList as List<List<SelectListItem>>; }
public ActionResult Detail()//對應的 { ViewBag.ddlStrList = CommonController.GetSelectListItemByFang();//加載下拉框選項 EnumDescription[] payTypeItemOption = EnumDescription.GetFieldTexts(typeof(Enumerator.PayType));//支付類型 ViewBag.PayType = new SelectList(payTypeItemOption, "EnumValue", "CNText"); return View(); }
區別 Html.RenderAction() 參考