MVC2中的Html.Partial(视图,模型)和Html.RenderPartial(视图,模型)有什么区别(如果有)?


141

除了返回的类型以及您当然以不同的方式称呼它

<% Html.RenderPartial(...); %>
<%= Html.Partial(...) %>  

如果它们不同,为什么您要称呼一个而不是另一个?
定义:

// Type: System.Web.Mvc.Html.RenderPartialExtensions
// Assembly: System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll

using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    public static class RenderPartialExtensions
    {
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName);
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, ViewDataDictionary viewData);
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model);

        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model,
                                     ViewDataDictionary viewData);
    }
}

// Type: System.Web.Mvc.Html.PartialExtensions
// Assembly: System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll

using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    public static class PartialExtensions
    {
        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName,
                                        ViewDataDictionary viewData);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model,
                                        ViewDataDictionary viewData);
    }
}

Answers:


168

唯一的区别是,Partial返回MvcHtmlString,并且必须在内部调用<%= %>,而直接RenderPartial返回void并渲染到视图。

如果查看源代码,您会看到它们都调用相同的内部方法,并传递StringWriter使其呈现。

Partial如果要查看,保存或操作生成的HTML,而不是将其写入页面,则将调用。


好的,所以没有任何:)就像我想的那样,我想我可以无缝地使用它们。谢谢:)
斯特凡2010年

40
不,就像SLaks所说的,区别在于返回类型。这是不平凡的。从性能角度来看,据称直接渲染到输出流会更好(这就是为什么它们开始使用void RenderPartial的原因)。Partial在测试中最有用(imo),尽管SLaks表示,可能会有一些地方需要在将输出呈现到生产代码中之前对其进行操作。他们只是很少见,imo。
Paul

42
当您想在控制器中获取视图的输出时,Partial也很有用。这可用于使用视图格式化电子邮件。
Samg 2010年

3
@Paul:我们在说什么?索赔是否有与之相关的任何测试或基准?有趣的是,这是否真正有用,或者仅仅是微优化。
克里斯·普拉特

1
我有一个问题:无论使用哪种方法,两者最终都将被渲染到结果流中(因为在Razor中,不仅调用它会将其发送到渲染视图的TextWriter),如果它们都调用相同的内部方法,为什么?一个会比另一个表现更好吗?是否由于它旋转了自己的内部缓冲区(会根据需要逐渐扩展)?我也很高兴其他人看到使用视图模型来呈现电子邮件的习惯;另一家开发商以为我过这样做,但它的清洁和更容易比你要逃离一切字符串操作。
艾伦克拉克科普兰JR

4

这是Dino Esposito的一个很好的解释:

两种方法之间的差异看起来很小且无害,但是如果您不知道如何处理它,它可能会咬您。两种方法之间的主要区别是:

  • Partial 返回一个HTML编码的字符串
  • RenderPartial直接写入响应输出流void方法。

两种方法的用法略有不同:

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

使用哪种选择取决于您的要求。如果您需要进一步处理在响应流中注入的字符串,则应使用Partial;。否则,使用RenderPartial -只是因为它直接进入流-比快一点Partial

最后,部分视图的用例属于两个阵营之一。第一种是通过将各种独立的标记组合在一起来创建视图,如下所示。

<body>
    @{ Html.RenderPartial("_Header"); }
    @Html.Partial("_Sidebar")
    <div class="container body-content">
       @RenderBody()
    </div>
    @{ Html.RenderPartial("_Footer"); }
</body>

在这种情况下,您决定是在最终效果之间进行选择RenderPartial还是 Partial不会改变。但是,由于 RenderPartial速度稍快,您可能更喜欢使用它。


4
-1从其他来源进行复印时,至少要给予信用。这是Pro ASP.NET MVC 3 Framework(或至少是较新的版本)中的逐字逐句副本。
Robotron
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.