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"); }
上图两个调用将会呈现一样的效果。