在 ASP.NET MVC 中,有什么区别:
Html.Partial
和Html.RenderPartial
Html.Action
和Html.RenderAction
Html.Partial
返回一个 String。 Html.RenderPartial
内部调用Write
并返回void
。
基本用法是:
// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName"); }
// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>
在上面的代码段中,两个调用都会产生相同的结果。
虽然可以将Html.Partial
的输出存储在变量中或从方法返回,但是不能使用Html.RenderPartial
执行此Html.RenderPartial
。结果将在执行 / 评估期间写入Response
流。
这也适用于Html.Action
和Html.RenderAction
。
将 @ Html.Partial 视为复制到父页面的 HTML 代码。将 @ Html.RenderPartial 视为合并到父页面中的. ascx 用户控件。 .ascx 用户控件的开销要大得多。
'@ Html.Partial'返回一个 html 编码的字符串,该字符串与父节点内联构造。它访问父模型。
'@ Html.RenderPartial'返回等效的. ascx 用户控件。它获得了自己的页面 ViewDataDictionary 副本,对 RenderPartial 的 ViewData 所做的更改不会影响父级的 ViewData。
使用反射我们发现:
public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData)
{
MvcHtmlString mvcHtmlString;
using (StringWriter stringWriter = new StringWriter(CultureInfo.CurrentCulture))
{
htmlHelper.RenderPartialInternal(partialViewName, viewData, model, stringWriter, ViewEngines.Engines);
mvcHtmlString = MvcHtmlString.Create(stringWriter.ToString());
}
return mvcHtmlString;
}
public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName)
{
htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, null, htmlHelper.ViewContext.Writer, ViewEngines.Engines);
}
差异是第一个返回MvcHtmlString
但第二个( Render..
)直接返回响应。