在ASP.NET MVC中,有什么区别:
Html.Partial
和Html.RenderPartial
Html.Action
和Html.RenderAction
答案 0 :(得分:1183)
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
执行此操作。结果将在执行/评估期间写入Response
流。
这也适用于Html.Action
和Html.RenderAction
。
答案 1 :(得分:81)
将@ 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);
}
答案 2 :(得分:55)
差异是第一个返回MvcHtmlString
但第二个(Render..
)输出直接返回响应。
答案 3 :(得分:51)
以下是我发现的内容:
如果您没有要发送到视图的模型并且有很多html可以恢复而不需要存储在变量中,请使用 RenderAction 。
当您没有要发送到视图的模型并且需要将一些文本带回来需要存储在变量中时,请使用操作。
当您要将模型发送到视图时使用 RenderPartial ,并且会有很多不需要存储在变量中的html。
当您要将模型发送到视图时使用部分,并且会有一些文本需要存储在变量中。
RenderAction 和 RenderPartial 更快。
答案 4 :(得分:21)
根据我的说法@Html.RenderPartial()
执行速度比@Html.Partial()
快,因为Html.RenderPartial可以快速响应输出。
因为当我使用@Html.Partial()
时,与@Html.RenderPartial()
相比,我的网站需要更多时间加载
答案 5 :(得分:18)
@Html.Partial
和@Html.RenderPartial
,我们不需要创建任何操作方法来调用它。
@Html.Action
和@Html.RenderAction
,基本上,当您要在页面上显示任何窗口小部件类型内容时,将使用它。您必须创建一个action方法,该方法在从视图调用方法时返回部分视图结果。
答案 6 :(得分:14)
关于这个问题的更多信息:
来自Professional ASP.NET MVC 1.0的“当使用部分名称调用Html.RenderPartial()时 看来,ASP.NET MVC将传递给局部视图相同的Model和 调用视图模板使用的ViewData字典对象。“
答案 7 :(得分:8)
Html.RenderAction
的返回类型为void
,这意味着它直接呈现View中的响应,其中Html.Action
的返回类型为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();
}
}
这将返回View的Html字符串。
这也适用于Html.Partial
和Html.RenderPartial
答案 8 :(得分:8)
Partial或RenderPartial:无需创建操作方法。当在局部视图上显示的数据已存在于当前页面的模型中时使用。
操作或RenderAction:需要子操作方法。当在视图上显示的数据具有独立模型时使用。
答案 9 :(得分:8)
<强>差异:强>
RenderPartial
的返回类型为void
,其中Partial
返回MvcHtmlString
在Razor视图中调用Partial()
和RenderPartial()
方法的语法
@ Html.Partial(&#34; PartialViewName&#34)
@ {Html.RenderPartial(&#34; PartialViewName&#34;); }
在webform视图中调用Partial()
和RenderPartial()
方法的语法
[%:Html.Partial(&#34; PartialViewName&#34;)%]
[%Html.RenderPartial(&#34; PartialViewName&#34;); %]
以下是与Partial()
和RenderPartial()
相关的2个常见面试问题
您何时使用Partial()
而不是RenderPartial()
,反之亦然?
主要区别在于RenderPartial()
返回void并且输出将直接写入输出流,而Partial()
方法返回MvcHtmlString
,可以将其分配给变量并在需要时操纵它。因此,当需要将输出分配给变量进行操作时,请使用Partial(),否则使用RenderPartial()。
哪一项效果更好?
从性能角度来看,直接渲染到输出流更好。 RenderPartial()
执行完全相同的操作,并且优于Partial()
的效果。
答案 10 :(得分:5)
Html.Partial
:返回MvcHtmlString
并缓慢
Html.RenderPartial
:直接在输出流上渲染/写入并返回void
,与Html.Partial
答案 11 :(得分:2)
对于“部分”,我总是按如下方式使用它:
如果您需要在需要通过控制器访问的页面中包含某些内容(就像使用Ajax调用那样),请使用“Html.RenderPartial”。
如果你有一个'静态'包含没有链接到控制器本身,只是在'共享'文件夹中,例如,使用“HTML.partial”
答案 12 :(得分:2)
@Html.Partial
以HTML编码的字符串返回视图,并使用相同的视图TextWriter
对象。
@Html.RenderPartial
此方法返回void
。
@Html.RenderPartial
比@Html.Partial
PartialView
的语法:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}