2011-02-08 6 views
2

に問題:のasp.net MVC強く型付けされたマスターページ - 私は2つのビューモデルを持っているタイプ

public class MasterPageViewModel 
{ 
    public string Meta { get; set; } 
} 

public class Entry : MasterPageViewModel 
{ 
    public int EntryID { get; set; } 
    public string Title { get; set; } 
    public DateTime PubDate { get; set; } 
} 

ビューに含まれているので、インデックスページには、エントリのリストを返します。そして、

...Inherits="System.Web.Mvc.ViewPage<IEnumerable<bl.Models.Entry>>" 

マスターページは

...Inherits="System.Web.Mvc.ViewMasterPage<bl.Models.MasterPageViewModel>" 

が含まれており、ここで私は取得していますエラーです:

辞書に渡されるモデル項目は 'System.Linq.EnumerableQuery`1 [bl.Models.Entry]'型ですが、この辞書には 'bl.Models.MasterPageViewModel'型のモデル項目が必要です。

マスターページでViewDataディクショナリを使用すると簡単にそのエラーを回避できますが、私の場合は強く型付けされたアプローチを使用します。将来、マスターページに表示されるカテゴリとタグのリストを追加できるようにしたいと考えています。

答えて

1

私は現在取り組んでいるMVCサイトで説明している構造のようなものがあります。私は本当に満足のいく答えは見つけられませんでした。多くの場合、マスターページとコンテンツページの2つの異なるモデルが必要なように感じられます。残念ながら、それはMVCの仕組みではありません。

私は、あなたが言及したViewDataオプション以外の1つのソリューションに出くわしました。

  • 基底クラスは、すべてのモデルがオフに継承し、基本クラスを作成します。

  • 基本クラスには、マスターページに必要なすべてのプロパティが含まれています。
  • 良い:それは単純な継承です
  • 悪い:エンベロープ可能なコレクションを渡すような基本的なことのためのラッパーメソッド/モデルで終わります。

だからあなたの場合には、あなたが何かのように終わるでしょう...

public class MasterPageViewModel { 
    public string Meta { get; set; } 
} 

public class Entry : MasterPageViewModel { 
    public IEnumerable<bl.Models.EntryItem> Items {get; set } 
} 

public class EntryItem{ 
    public int EntryID { get; set; } 
    public string Title { get; set; } 
    public DateTime PubDate { get; set; } 
} 

そして、あなたのインデックスページには、次のようになります...

...Inherits="System.Web.Mvc.ViewPage<bl.Models.Entry>" 

それは痛みのようなものですあなたが小さなモデルの多くで終わるので、お尻。私がそれに慣れれば、私はそれについて考えるのをやめました。

HTH、

-eric

+0

こんにちはエリック、 私は余分のviewmodelsを作成せずに、Html.RenderActionを使用して問題を解決しました。私は自分自身を繰り返すことを望まず、すべての共通のアクションをsepareコントローラ:CommonControllerに配置しました。次に、マスターページでは、Html.RenderAction( "Categories"、 "Common")またはHtml.RenderAction( "Tags"、 "Common")を使用します。各アクションは強く型付けされ、部分的なビューを返します。 – 303

関連する問題