mvc4源碼學習-@Html.Partial,@Html.RenderPartial


兩者都可以輸出一個Partial視圖;其區別如下: 
1. Partial有返回值(MvcHtmlString);RenderPartial沒有返回值(Void)。

先看看Partial方法的實現。

 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());
            }
        }

會創建一個MvcHtmlString對象返回,具體的就是實例化一個帶有一個value參數的MvcHtmlString對象返回,這個value參數就是調用到的部分視圖下的字符串。

而RenderPartial方法:

 public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName)
        {
            htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, null /* model */, htmlHelper.ViewContext.Writer, ViewEngines.Engines);
        }

從這兩行代碼可以看到都調用的是htmlHelper.RenderPartialInternal方法,一個將輸出的字符串用MvcHtmlString封裝了下,具體看看htmlHelper.RenderPartialInternal方法里做了些什么:

 view.Render(newViewContext, writer);

上面那個方法是最后的調用該方法需要的參數是ViewContext和TextWriter對象,其實就是相關聯的上下文和字符串文本。而這個方法里又調用了它

public void Render(ViewContext viewContext, TextWriter writer)
        {
           ...
            object instance = null;
           ...
            }
            RenderView(viewContext, writer, instance);
        }

這里第三個參數的創建過程在此可以不用考慮,

protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance)
        {
            ...
            WebViewPage webViewPage = instance as WebViewPage;            
            ...
            webViewPage.OverridenLayoutPath = LayoutPath;
            webViewPage.VirtualPath = ViewPath;
            webViewPage.ViewContext = viewContext;
            webViewPage.ViewData = viewContext.ViewData;
            ....
            webViewPage.InitHelpers();
            ... 
             webViewPage.ExecutePageHierarchy(new WebPageContext(context: viewContext.HttpContext, page: null, model: null), writer, startPage);
        }   

上面可以看到會將參數instance強制轉換為webViewPage對象。該對象下的InitHelpers()我們懂的,就是給頁面上那幾個Html/Ajax/Url屬性賦值。

 

@Html.Partial("test")

@{
    Html.RenderPartial("test");
 }

上圖兩個調用將會呈現一樣的效果。

 

附上一個源碼地址:http://pan.baidu.com/s/1kT2Z3V5

當然也可以在codeplex上下載。


免責聲明!

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



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