在 ASP.NET MVC 中,有什么区别:
Html.Partial
和Html.RenderPartial
Html.Action
和Html.RenderAction
在 ASP.NET MVC 中,有什么区别:
Html.Partial
和Html.RenderPartial
Html.Action
和Html.RenderAction
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 视为复制到父页面的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);
}
这是我发现的:
当您没有要发送到视图的模型并且有很多不需要存储在变量中的 html 要带回时,请使用RenderAction 。
当您没有要发送到视图的模型并且需要带回一些需要存储在变量中的文本时,请使用Action 。
当你有一个模型要发送到视图并且会有很多不需要存储在变量中的 html 时,请使用RenderPartial 。
当您有一个模型要发送到视图并且会有一点文本需要存储在变量中时,请使用Partial 。
RenderAction和RenderPartial更快。
区别在于第一个返回一个MvcHtmlString
但第二个 ( Render..
) 直接输出到响应。
@Html.Partial
并且@Html.RenderPartial
在您的部分视图模型是父模型的对应关系时使用,我们不需要创建任何操作方法来调用它。
@Html.Action
并且@Html.RenderAction
在您的局部视图模型独立于父模型时使用,基本上当您想要在页面上显示任何小部件类型的内容时使用它。在从视图中调用该方法时,您必须创建一个返回部分视图结果的操作方法。
据我说@Html.RenderPartial()
,它的执行速度比@Html.Partial()
Html.RenderPartial 对输出的快速响应要快。
因为当我使用时@Html.Partial()
,我的网站需要更多的时间来加载 @Html.RenderPartial()
更多关于这个问题:
“当仅使用局部视图的名称调用 Html.RenderPartial() 时,ASP.NET MVC 会将调用视图模板使用的相同模型和 ViewData 字典对象传递给局部视图。”
来自 Professional ASP.NET MVC 1.0 的“NerdDinner”
Partial 或 RenderPartial:无需创建动作方法。当要在局部视图上显示的数据已经存在于当前页面的模型中时使用。
Action 或 RenderAction:需要子操作方法。当要在视图上显示的数据具有独立模型时使用。
差异:
的返回类型RenderPartial
是void
,其中 asPartial
返回MvcHtmlString
Razor 视图中调用Partial()
和方法的语法RenderPartial()
@Html.Partial("PartialViewName")
@{ Html.RenderPartial("PartialViewName"); }
Webform 视图中调用Partial()
和方法的语法RenderPartial()
[%: Html.Partial("PartialViewName") %]
[% Html.RenderPartial("PartialViewName"); %]
以下是 2 个常见的面试问题,与Partial()
您RenderPartial()
何时使用Partial()
over相关RenderPartial()
,反之亦然?
主要区别在于RenderPartial()
返回 void 并且输出将直接写入输出流,其中Partial()
方法返回MvcHtmlString
,可以将其分配给变量并在需要时对其进行操作。因此,当需要将输出分配给变量以进行操作时,请使用 Partial(),否则使用 RenderPartial()。
哪一个对性能更好?
从性能的角度来看,直接渲染到输出流更好。RenderPartial()
做完全相同的事情,并且在性能上更好Partial()
。
的返回类型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();
}
}
这将返回视图的 Html 字符串。
这也适用于Html.Partial
和Html.RenderPartial
Html.Partial
: 回报MvcHtmlString
和缓慢
Html.RenderPartial
:直接在输出流上渲染/写入并返回void
,与Html.Partial
@Html.Partial
返回 HTML 编码字符串中的视图并使用相同的视图TextWriter
对象。
@Html.RenderPartial
这个方法返回void
。
@Html.RenderPartial
比@Html.Partial
的语法PartialView
:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}
对于“部分”,我总是按如下方式使用它:
如果您需要在需要通过控制器的页面中包含某些内容(就像使用 Ajax 调用一样),请使用“Html.RenderPartial”。
例如,如果您有一个未链接到控制器本身并且仅在“共享”文件夹中的“静态”包含,请使用“HTML.partial”