MVC2のHtml.Partial(view、model)とHtml.RenderPartial(view、model)の(ある場合)違いは何ですか?


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);
    }
}

回答:


168

唯一の違いは、をPartial返し、のMvcHtmlString内部<%= %>で呼び出す必要があるのに対して、ビューに直接RenderPartial戻りvoid、レンダリングされることです。

あなたが見ればソースコードを、あなたは彼らの両方の呼び出し同じ内部メソッドは、それがレンダリングするためにStringWriterを渡していることがわかります。

Partial生成されたHTMLをページに書き込むのではなく、表示、保存、または操作する場合に呼び出します。


わかりましたので、:)はありません。思ったように、シームレスに使用できると思います。おかげで:)
ステファン・

40
いいえ、SLaksが言ったように、違いは戻り値の型です。これは重要なことです。パフォーマンスの面では、出力ストリームへの直接レンダリングの方が優れていると主張されています(そのため、最初からvoid RenderPartialを使用していました)。SLaksが言ったように、プロダクションコードでレンダリングする前に出力を操作したい場合があるかもしれませんが、Partialは主にテストに役立ちます(imo)。彼らは珍しいです、イモ。
ポール

42
Partialは、コントローラーでビューの出力を取得する場合にも役立ちます。これは、ビューを使用して電子メールをフォーマットするために使用できます。
Samg

3
@Paul:どれだけ多くのパフォーマンスを発揮していますか?主張には、それに関連するテストやベンチマークがありますか?これに実際の肉があるのか​​、それが単なるミクロ最適化なのかを確認するのは興味深いでしょう。
Chris Pratt、

1
私が持っている質問は、両方が同じ内部メソッドを呼び出す場合、どちらを使用しても、結果ストリームにレンダリングされることになります(RazorではレンダリングされたビューのTextWriterに送信するだけではないため)。 1つは他よりもパフォーマンスが良いでしょうか?それはそれ自体の内部バッファをスピンアップするためのものですか(必要に応じて徐々に拡張されます)?また、ビューモデルを使用して電子メールをレンダリングする方法を他の誰かが見たのも嬉しいです。別の開発者はクリーナーとあなたがすべてをエスケープする必要があり、文字列よりも操作しやすく、私はそれをオーバーしていたと思ったが、それの。
アレン・クラーク・コープランドジュニア

4

これは、Dino Espositoによる素晴らしい説明です。

2つの方法の違いは小さくて無害に見えるかもしれませんが、それを処理する方法がわからない場合、それはあなたに噛みつくかもしれません。2つの方法の主な違いは次のとおりです。

  • Partial HTMLエンコードされた文字列を返します
  • RenderPartialある応答出力ストリームに直接書き込みを無効方法は。

2つの方法の使用法は少し異なります。

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

どちらを使用するかは、要件によって異なります。応答ストリームに注入される文字列をさらに操作する必要がある場合は、を使用する必要がありますPartial。それ以外の場合RenderPartial はそのままですPartial。ストリームに直行するためです。

結局、部分的なビューのユースケースは2つのキャンプのどちらかに該当します。1つ目は、以下のように、さまざまな独立したマークアップを組み合わせてビューを作成する場合です。

<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フレームワーク(または少なくとも新しいエディション)からの露骨なコピーです。
Robotron、2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.