ChatGPT解决这个技术问题 Extra ChatGPT

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

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

Html.Partial 和 Html.RenderPartial

Html.Action 和 Html.RenderAction

stackoverflow.com/a/30258091/4336332 这也可能有所帮助。看一看。

A
Arsen Khachaturyan

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.ActionHtml.RenderAction


你知道为什么你会使用一个而不是另一个吗?
性能方面,最好使用 RenderPartial,如下所示:stackoverflow.com/questions/2729815/…
感谢您将结果存储到变量中。这就是在 Render 对应物上使用 Partial 或 Action 的原因。
创建 Html.Partial() 是为了在 Razor 中使用更流畅的语法。正如@Vlad 所说,Html.RenderPartial() 效率更高。
@Tsahi 解释了为什么在 _LoginPartial 的 MVC 项目模板中使用它。谢谢。
C
CodeBon

将@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.Partial 的性能比 Html.RenderPartial 好?
是也不是,Html.Partial 是内联渲染的,占用资源较少,但更耗时。 Html.RenderPartial 是单独渲染的,因此速度更快,但更占用资源。如果您有大量突发流量,请使用 Html.Partial 以减少资源使用。如果您的流量变化不频繁,请使用 Html.RenderPartial。
在我看来,情况正好相反:RenderPartial 绝对具有更好的性能,因为它直接写入输出流。 Partial 在内部调用相同的方法,但写入一个 StringWriter,它作为 MvcHtmlString 返回并最终写入输出流。因此它分配了更多的内存。
@BrettJones“资源密集型”是什么意思?仅仅因为 Partial 呈现到缓冲区并不意味着它是异步呈现的 - 恰恰相反 - 我看不出您如何声称 RenderPartial 是“更多资源密集型”。
D
David

这是我发现的:

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

当您没有要发送到视图的模型并且需要带回一些需要存储在变量中的文本时,请使用 Action。

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

当您有一个模型要发送到视图并且会有一点文本需要存储在变量中时,请使用 Partial。

RenderAction 和 RenderPartial 更快。


回答(为什么?)是最好的答案,所以这对我来说是最好的。
如果 [OutputCache] 被使用,@David 会很好地详细说明使用什么?我有一种直觉,如果涉及缓存,那么 Action / RenderAction 是要走的路,因为它们确实尊重 [OutputCache](与 Partial / RenderPartial 完全忽略它从而损害性能相反)。不过我可能是错的。
A
Aliostad

不同之处在于第一个返回 MvcHtmlString 而第二个 (Render..) 直接输出到响应。


不会将 MvcHtmlString 也添加到响应中吗?
Shad,Html.Partial() 方法返回 MvcHTMLString,剃须刀视图引擎将使用该字符串将内容添加到响应正文。
s
shyam

@Html.Partial@Html.RenderPartial 用于当您的 Partial 视图模型是父模型的对应关系时,我们不需要创建任何操作方法来调用它。

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


很好的答案,因为您还解释了何时使用 Partial over Action
R
Risto Välimäki

据我说,@Html.RenderPartial() 的执行速度比 @Html.Partial() 快,因为 Html.RenderPartial 可以快速响应输出。

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


O
Owen Pauling

更多关于这个问题:

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

来自 Professional ASP.NET MVC 1.0 的“NerdDinner”


A
Anil

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

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


N
Nazmul Hasan

差异:

RenderPartial 的返回类型为 void,其中 Partial 返回用于在 Razor 视图中调用 Partial() 和 RenderPartial() 方法的 MvcHtmlString 语法 @Html.Partial("PartialViewName") @{ Html.RenderPartial("PartialViewName");在 webform 视图中调用 Partial() 和 RenderPartial() 方法的语法

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

以下是与 Partial()RenderPartial() 相关的 2 个常见面试问题,您何时使用 Partial() 而不是 RenderPartial(),反之亦然?

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

哪一个对性能更好?

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


R
Rajesh

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


如何使用 Html.RenderPartial 做到这一点?
我们不能使用 Html.RenderPartial 因为它的返回类型是 void
u
user247702

Html.Partial:返回 MvcHtmlString 并且慢

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


R
RickL

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

PartialView 的语法:

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

s
scgough

对于“部分”,我总是按如下方式使用它:

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

例如,如果您有一个未链接到控制器本身并且仅在“共享”文件夹中的“静态”包含,请使用“HTML.partial”