Razorビューエンジン-部分ビューを追加するにはどうすればよいですか


84

可能であれば、新しいレイザービューエンジンを使用してパーシャルをレンダリングするための最良の方法は何であるか疑問に思いました。これはその時までに完全に終わっていなかったものだと理解しています

現在、RenderPageを使用してユーザーコントロールをレンダリングしています。

@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)

RenderPageを呼び出すページは、TitleContent、HeadContent、Maincontentの3つのセクションが定義されたレイアウト(マスター)ページを使用します。このページからロケールコントロールをレンダリングしようとすると、これらのセクションも必要であるように見えます。これらのセクションは、呼び出し元のページでのみ必要であり、存在しているはずです。部分ビューにセクションを含めるかどうかに関係なく、次のメッセージが表示されます(明らかに、これらのセクションを含めたくありませんが、興味深いデバッグポイントのように見えました...)。

次のセクションは定義されていますが、レイアウトページ '〜/ Views / Shared / LocaleUserControl.cshtml'には表示されていません:TitleContent; HeadContent; メインコンテンツ

私の部分的な見解は次のとおりです(次のリンクから適応):

@inherits System.Web.Mvc.WebViewPage<LocaleBaseModel>
@using System.Web.UI;

<p>
     @Html.LabelFor(model => Model.CountryName)
    <br />
    @Html.DropDownListFor(model => Model.CountryName,null, string.Empty, new { @class = "text", accesskey="u"})
</p>
<p>
     @Html.LabelFor(model => Model.StateProvince)
    <br />
     @Html.DropDownListFor(model => Model.StateProvince, null, string.Empty, new { @class = "text", accesskey="t" })
</p>


<script type="text/javascript">
    $(function () {
        var countries = $("#CountryName");
        var statesprovinces = $("#StateProvince");
        countries.change(function () {
            statesprovinces.find('option').remove();
            var url = '@Url.Action("GetStatesProvinces", "Base")';
            $.getJSON(url, { countryId: countries.val() }, function (data) {
                $(data).each(function () {
                    $("<option value=" + this.ID + ">" + this.Name + "</option>").appendTo(statesprovinces);
                });
            });
        });
    });
</script>

回答:


125

パーシャルはエディターテンプレートによく似ているので、そのように含めることができます(もちろん、パーシャルが~/views/controllername/EditorTemplatesサブフォルダーに配置されていると仮定します)。

@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)

または、これが単に当てはまらない場合:

@Html.Partial("nameOfPartial", Model)

フィードバックをありがとう...この場合、Html.EditorForは良い考えかもしれませんが、より複雑な例には当てはまらないので、代替案を見てみたいと思います。私は間違いなくすぐにこれに再び遭遇するでしょう。それはWebViewPageからカミソリ部分派生...一方ビューページまたはViewUserControlから派生しなければなりませんようHtml.Partialは動作しません
JPを。

4
Html.Partialは完全に正常に機能します。Razorビューエンジンを使用してVisualStudioで新しいASP.NETMVC 3プロジェクトを開始_Layout.cshtml し、Sharedフォルダー内のファイルを開いて、_LogOnPartial.cshtmlその派生元がどのように行われるかWebViewPageを確認します(Html.Partialを使用)。だから、何も、部分的には、から派生する必要はありませんしないViewPageViewUserControlのために、すべてのHtml.Partial仕事に。
ダリンディミトロフ2010

1
うーん、あなたは正しいようです。また、デバッグを行う必要があるようです。ありがとう!
JP。

1
Html.RenderPartial以前は、voidを返すASPXページで使用していました。 Html.Partialを返しますMvcHtmlString。したがって、パーシャルに多くのマークアップが含まれている場合は、非常に大きな文字列オブジェクトを作成して、すぐにGCするだけにします。Razorを使用して出力に直接レンダリングすることをサポートするアプローチはありますか?
ドリューノアケス2011

2
@DrawRenderPartialを@{...}ブロックにラップすることはうまくいくはずだと思います。より良い解決策があるかどうかはわかりません。
CodesInChaos 2011年

0

コードを複製したくない場合、そして私のように統計を表示したいだけの場合は、ビューモデルで、次のようにデータを取得するモデルを渡すことができます。

public class GameViewModel
{
    public virtual Ship Ship { get; set; }
    public virtual GamePlayer GamePlayer { get; set; }     
}

次に、コントローラーでそれぞれのモデルに対してクエリを実行し、それらをビューモデルに渡して、それを返します。例:

GameViewModel PlayerStats = new GameViewModel();

GamePlayer currentPlayer = (from c in db.GamePlayer [more queries]).FirstOrDefault();

[結果を確認するためのコード]

//pass current player into custom view model
PlayerStats.GamePlayer = currentPlayer;

私が言ったように、関連するテーブルから統計を表示したい場合にのみこれを実際に行う必要があり、他の人が前述したセキュリティ上の理由から、CRUDプロセスの他の部分は発生していません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.