Html.Partial vs Html.RenderPartial&Html.Action vs Html.RenderAction

Gho*_*ngi 1013 .net asp.net-mvc renderpartial partial-views renderaction

在ASP.NET MVC中,有什么区别:

  • Html.PartialHtml.RenderPartial
  • Html.ActionHtml.RenderAction

GvS*_*GvS 1221

Html.Partial返回一个String.内部Html.RenderPartial调用Write并返回void.

基本用法是:

// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName");  }

// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>
Run Code Online (Sandbox Code Playgroud)

在上面的代码段中,两个调用都会产生相同的结果.

虽然可以将Html.Partial变量的输出存储在一个变量中,或者从一个方法返回它,但是不能这样做Html.RenderPartial.结果将Response在执行/评估期间写入流.

这也适用于Html.ActionHtml.RenderAction.

  • 性能方面,最好使用RenderPartial,如下所示:http://stackoverflow.com/questions/2729815/what-is-the-difference-if-any-between-html-partialview-model-and-html-rende (152认同)
  • 你知道为什么要用一个而不是另一个吗? (70认同)
  • 感谢您将结果存储到变量中.这是在Render对应物上使用Partial或Action的原因. (12认同)
  • 使用Razor创建了一个更流畅的语法`Html.Partial()`.正如@Vlad所说,`Html.RenderPartial()`更有效率. (8认同)
  • @Tsahi解释了为什么它在_LoginPartial的MVC项目模板中使用.谢谢. (2认同)

Bre*_*nes 82

将@ 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 是和否,Html.Partial是内联呈现的,资源消耗较少,但更耗时.Html.RenderPartial是单独渲染的,因此速度更快,但资源密集程度更高.如果您有高容量突发流量,则支持Html.Partial以减少资源使用.如果您不经常更改流量有利于Html.RenderPartial. (15认同)
  • 在我看来,它是相反的:RenderPartial肯定具有更好的性能,因为它直接写入输出流.部分内部调用相同的方法,但写入StringWriter,它作为MvcHtmlString返回,最后写入输出流.因此它分配了更多的内存. (4认同)
  • 你是说Html.Partial比Html.RenderPartial有更好的性能吗? (3认同)
  • @BrettJones"资源密集型"是什么意思?仅仅因为`Partial`渲染到缓冲区并不意味着它被异步渲染 - 恰恰相反 - 我无法看到你如何声称`RenderPartial`是"更加资源密集". (2认同)

Ali*_*tad 55

差异是第一个返回一个MvcHtmlString但第二个(Render..)输出直接响应.


Dav*_*vid 52

这是我发现的:

如果没有要发送到视图的模型并且有很多html要返回,则不需要将其存储在变量中,请使用RenderAction.

如果没有要发送到视图的模型并且需要将一些文本带回需要存储在变量中,请使用Action.

当你有一个模型要发送到视图时使用RenderPartial,并且会有很多不需要存储在变量中的html.

如果要将模型发送到视图,则使用" 部分",并且会有一些需要存储在变量中的文本.

RenderActionRenderPartial更快.

  • 回答(为什么?)是最好的答案,所以这对我来说是最好的。 (2认同)

iCh*_*rag 21

据我说@Html.RenderPartial(),执行速度比@Html.Partial()Html快.RenderPartial给出了对Output的快速响应.

因为当我使用时@Html.Partial(),我的网站需要更多的时间来加载 @Html.RenderPartial()


小智 19

@Html.Partial并且@Html.RenderPartial在使用时的局部视图模型是父模型的对应关系,我们并不需要创建任何操作的方法来调用它.

@Html.Action@Html.RenderAction当你的局部视图模型是独立于父模型的使用,基本上当你想在页面上显示任何插件类型的内容使用它.您必须创建一个action方法,该方法在从视图调用方法时返回部分视图结果.

  • 很好的答案,因为你还解释了什么时候使用Partial over Action (3认同)

Ygo*_*maz 14

更多关于这个问题:

"当使用部分视图的名称调用Html.RenderPartial()时,ASP.NET MVC将向调用视图模板使用的相同Model和ViewData字典对象传递给局部视图."

来自Professional ASP.NET MVC 1.0的"NerdDinner"


Shi*_*mar 8

返回类型Html.RenderActionvoid指它直接在View中呈现响应,其中返回类型Html.ActionMvcHtmlString您可以在控制器中捕获其呈现视图并使用以下方法对其进行修改

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这将返回View的Html字符串.

这也适用于Html.PartialHtml.RenderPartial


Ani*_*nil 8

Partial或RenderPartial:无需创建操作方法.当在局部视图上显示的数据已经存在于当前页面的模型中时使用.

Action或RenderAction:需要子操作方法.当在视图上显示的数据具有独立模型时使用.


Naz*_*san 8

区别:

  1. 返回类型RenderPartialvoid,Partial返回的位置MvcHtmlString

  2. 在Razor视图中调用Partial()RenderPartial()方法的语法

    @ Html.Partial("PartialViewName")
    @ {Html.RenderPartial("PartialViewName"); }

  3. 语法调用Partial()RenderPartial()在网络表单视图方法

[%:Html.Partial("PartialViewName")%]
[%Html.RenderPartial("PartialViewName"); %]

以下是相关的2个常见的面试问题Partial()RenderPartial() 什么时候使用Partial()RenderPartial(),反之亦然?

主要区别在于RenderPartial()返回void并且输出将直接写入输出流,在Partial()方法返回时MvcHtmlString,可以将其分配给变量并在需要时对其进行操作.因此,当需要将输出分配给变量以进行操作时,请使用Partial(),否则使用RenderPartial().

哪一个更适合性能?

从性能角度来看,直接渲染到输出流更好.RenderPartial()完全相同的事情,并且表现更好Partial().


Nav*_*eet 5

Html.Partial:回归MvcHtmlString

Html.RenderPartial:直接在输出流上渲染/写入并返回void,与之相比它非常快Html.Partial


小智 5

@Html.Partial返回 HTML 编码字符串中的视图并使用相同的视图TextWriter对象。 @Html.RenderPartial该方法返回void@Html.RenderPartial@Html.Partial

的语法PartialView

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

559308 次

最近记录:

6 年,5 月 前