web-dev-qa-db-ja.com

ASP.NET MVCのマスターページにデータを渡す

MVCルールを破らずにデータをマスターページに(ASP.NET MVCを使用して)渡す方法は何ですか?

個人的には、すべてのビューに渡される抽象コントローラー(ベースコントローラー)またはベースクラスをコーディングすることを好みます。

102
Łukasz Sowa

ビューが強く型付けされたビューデータクラスを持つことを望むなら、これはあなたのために働くかもしれません。他の解決策はおそらくもっと多くの正しいですが、これはデザインと実用性の見事なバランスです。

マスターページは、関連する情報のみを含む、強く型付けされたビューデータクラスを取ります。

public class MasterViewData
{
    public ICollection<string> Navigation { get; set; }
}

そのマスターページを使用する各ビューは、その情報を含み、マスターページのビューデータから派生する、強く型付けされたビューデータクラスを取ります。

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

マスターページのデータをまとめることについて個々のコントローラーに何も知らせたくないので、そのロジックを各コントローラーに渡されるファクトリーにカプセル化します。

public interface IViewDataFactory
{
    T Create<T>()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create<ProductViewData>();

        viewData.Name = "My product";
        viewData.Price = 9.95;

        return View("Index", viewData);
    }
}

継承はマスターとビューの関係をよく一致させますが、パーシャル/ユーザーコントロールのレンダリングに関しては、ビューデータをページビューデータに構成します。

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
    public SubViewData SubViewData { get; set; }
}

<% Html.RenderPartial("Sub", Model.SubViewData); %>

これはサンプルコードのみであり、そのままコンパイルするためのものではありません。ASP.NetMVC 1.0用に設計されています。

77
Generic Error

マスタービューのデータドリブンの断片をパーシャルに分割し、Html.RenderActionを使用してレンダリングすることを好みます。これには、一般的なビューモデルの継承アプローチに比べていくつかの明確な利点があります。

  1. マスタービューデータは、「通常の」ビューモデルから完全に分離されています。これは継承を介した合成であり、変更が容易な疎結合システムになります。
  2. マスタービューモデルは、完全に独立したコントローラーアクションによって構築されます。 「通常の」アクションはこれについて心配する必要はありません。また、ビューデータファクトリは必要ありません。これは私の好みにとって過度に複雑に思えます。
  3. AutoMapper のようなツールを使用してドメインをビューモデルにマッピングする場合、ビューモデルは継承しない場合にドメインモデルにより似ているため、設定が容易になります。マスタービューデータ。
  4. マスターデータに対して個別のアクションメソッドを使用すると、ページの特定の領域に出力キャッシュを簡単に適用できます。通常、マスタービューには、メインページのコンテンツよりも頻繁に変更されないデータが含まれています。
59
Todd Menier

[〜#〜] edit [〜#〜]

一般的なエラー は、以下のより良い答えを提供しています。読んでください!

元の回答

Microsoftは実際に 「公式」な方法 でこれを処理するエントリを投稿しました。これにより、ステップごとのウォークスルーとその推論の説明が提供されます。

つまり、抽象コントローラークラスを使用することをお勧めしますが、実際に見てください。

20
Michael La Voie

抽象コントローラーは良いアイデアであり、私はより良い方法を見つけていません。他の人が何をしたかにも興味があります。

7
Ian P

私はいくつかの調査を行い、これらの2つのサイトに出会いました。たぶん彼らは助けることができます。

ASP.NET MVCヒント#31 –マスターページとユーザーコントロールへのデータの受け渡し

ASP.NET MVCを使用してデータをマスターページに渡す

3
David Negron

ビューに渡すすべてのモデルオブジェクトの共通の親が非常に便利であることがわかりました。

とにかく、常にページ間にいくつかの一般的なモデルプロパティがある傾向があります。

2
Matt Mitchell

別の良い方法は、いくつかのインターフェイスのParentViewのようなプロパティを持つビューのインターフェイスを作成することです。そのため、ページへの参照を必要とするコントロール(親コントロール)とアクセスする必要があるマスタービューの両方に使用できますビュー。

0
dimarzionist

他のソリューションは優雅さに欠け、時間がかかりすぎます。ほぼ1年後、この非常に悲しく貧しいことを行ったことをおaびします。

<script runat="server" type="text/C#">
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        MasterModel = SiteMasterViewData.Get(this.Context);
    }

    protected SiteMasterViewData MasterModel;
</script>

そのため、SiteMasterViewDataを返すSiteMasterViewDataにこの静的メソッドGet()があります。

0
rasx

Request.Paramsオブジェクトは変更可能です。要求処理サイクルの一部としてスカラー値を追加するのは非常に簡単です。ビューの観点から、その情報はQueryStringまたはFORM POSTで提供されている可能性があります。 hth

0
mtutty