ASP.NET MVC RenderPartial和Partial的區別


 

背景: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() 參考 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM