提问



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



  • Html.PartialHtml.RenderPartial

  • Html.ActionHtml.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执行此操作。结果将在执行/评估期间写入Response流。


这也适用于Html.ActionHtml.RenderAction

其它参考1


将@ 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


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

其它参考3


这是我发现的:


当您没有要发送到视图的模型并且有很多html要返回时不需要存储在变量中时,请使用 RenderAction


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


如果要将模型发送到视图,请使用 RenderPartial ,并且会有很多html不需要存储在变量中。


如果要将模型发送到视图,请使用部分,并且需要将一些文本存储在变量中。


RenderAction RenderPartial 更快。

其它参考4


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


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

其它参考5


当您的部分视图模型与父模型相对应时,使用@Html.Partial@Html.RenderPartial,我们不需要创建任何操作方法来调用它。


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

其它参考6


更多关于这个问题:



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



来自Professional ASP.NET MVC 1.0的NerdDinner

其它参考7


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.PartialHtml.RenderPartial

其它参考8


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


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

其它参考9


差异:



  1. RenderPartial的返回类型为void,其中Partial返回MvcHtmlString

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



      @ Html.Partial( PartialViewName)结果
      @ {Html.RenderPartial(PartialViewName); }


  3. 在webform视图中调用Partial()RenderPartial()方法的语法




  [[%:Html.Partial(PartialViewName)%]]

  [[%Html.RenderPartial(PartialViewName); %]]



以下是与Partial()RenderPartial()相关的2个常见访谈问题
你什么时候使用Partial()而不是RenderPartial(),反之亦然?


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


哪一个更适合性能?


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

其它参考10


Html.Partial:返回MvcHtmlString并缓慢


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

其它参考11


对于部分,我总是使用它如下:


如果您需要在需要通过控制器访问的页面中包含某些内容(就像使用Ajax调用那样),请使用Html.RenderPartial。


如果你有一个静态包含没有链接到控制器本身,只是在共享文件夹中,例如,使用HTML.partial

其它参考12


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


PartialView的语法:


 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }