Answers:
Html.Partial
返回一个字符串。内部Html.RenderPartial
调用Write
并返回void
。
基本用法是:
// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName"); }
// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>
在上面的代码段中,两个调用将产生相同的结果。
虽然可以将的输出存储Html.Partial
在变量中或从方法中返回,但不能使用来完成Html.RenderPartial
。
结果将Response
在执行/评估期间写入流中。
这也适用于Html.Action
和Html.RenderAction
。
Html.Partial()
旨在使Razor的语法更加流畅。正如@Vlad所说,Html.RenderPartial()
效率更高。
将@ 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);
}
Partial
渲染到缓冲区并不意味着它是异步渲染的-恰恰相反-我看不到如何声称RenderPartial
“资源更多”。
@Html.Partial
并且@Html.RenderPartial
在您的部分视图模型是父模型的对应模型时使用,并且我们不需要创建任何操作方法来调用它。
@Html.Action
而@Html.RenderAction
当你的局部视图模型是独立于父模型的使用,基本上当你想在页面上显示任何插件类型的内容使用它。您必须创建一个操作方法,该操作方法在从视图调用该方法时会返回部分视图结果。
有关此问题的更多信息:
“仅使用部分视图的名称调用Html.RenderPartial()时,ASP.NET MVC会将与调用视图模板使用的相同的Model和ViewData字典对象传递给部分视图。”
专业ASP.NET MVC 1.0中的“ NerdDinner”
返回类型为Html.RenderAction
is void
意味着它直接在View中渲染响应,而返回类型为Html.Action
is MvcHtmlString
可以在控制器中捕获其渲染视图并使用以下方法对其进行修改
protected string RenderPartialViewToString(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData.GetRequiredString("action");
ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
这将返回视图的HTML字符串。
这也适用于Html.Partial
和Html.RenderPartial
差异:
的返回类型RenderPartial
为void
,其中Partial
返回为MvcHtmlString
Razor视图中的调用语法Partial()
和RenderPartial()
方法
@ Html.Partial(“ PartialViewName”)
@ {Html.RenderPartial(“ PartialViewName”); }
Webform视图中调用的语法Partial()
和RenderPartial()
方法
[%:Html.Partial(“ PartialViewName”)%]
[%Html.RenderPartial(“ PartialViewName”); %]
以下是与Partial()
和有关的两个常见面试问题。RenderPartial()
何时使用Partial()
over RenderPartial()
,反之亦然?
主要区别在于,RenderPartial()
返回void并将输出直接写入输出流,在此Partial()
方法返回时MvcHtmlString
,可将其分配给变量并在需要时对其进行操作。因此,当需要将输出分配给变量进行操作时,请使用Partial(),否则请使用RenderPartial()。
哪一个性能更好?
从性能的角度来看,直接渲染到输出流更好。RenderPartial()
做完全一样的事情,并且性能优于Partial()
。