103

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

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

4

9 に答える 9

77

ビューに厳密に型指定されたビュー データ クラスを持たせたい場合は、これでうまくいくかもしれません。他の解決策はおそらくより正しいですが、これはデザインと実用性のバランスが取れています。

マスター ページは、それに関連する情報のみを含む、厳密に型指定されたビュー データ クラスを受け取ります。

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.Net MVC 1.0 用に設計されています。

于 2009-04-14T01:33:07.737 に答える
60

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

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

編集

Generic Errorは、以下のより良い回答を提供しています。読んでください!

元の回答

Microsoft は実際に、これを処理する「公式」の方法に関するエントリを投稿しました。これは、その理由の説明とともに段階的なウォークスルーを提供します。

要するに、彼らは抽象コントローラー クラスの使用を推奨していますが、自分の目で確かめてください。

于 2009-06-04T06:26:58.863 に答える
7

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

于 2008-09-17T00:12:41.573 に答える
3

いろいろ調べていたら、この2つのサイトにたどり着きました。多分彼らは助けることができます。

ASP.NET MVC のヒント #31 – マスター ページとユーザー コントロールにデータを渡す

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

于 2008-09-17T00:15:18.527 に答える
2

ビューに渡すすべてのモデル オブジェクトの共通の親は非常に便利です。

いずれにせよ、ページ間に共通のモデル プロパティが常に存在する傾向があります。

于 2008-09-17T00:27:34.657 に答える
0

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

于 2008-09-17T00:12:56.223 に答える
0

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

于 2008-09-17T00:19:25.740 に答える
0

他のソリューションは洗練されておらず、時間がかかりすぎます。ほぼ1年後に、この非常に悲しく貧しいことをしたことをお詫びします。

<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() があります。

于 2009-09-30T05:28:38.703 に答える