2009-05-19 4 views
2

私のプロジェクトのすべてのコントローラは、エンティティモデルでプロパティを持つベースコントローラから継承します。ASP.NET MVC:ヘルパーはデータを取得できますか?

私は、世界の都市を示すビューを持っており、国別にフィルタリングするオプションがあるとしましょう。国フィルタは、データベースの国のドロップダウンリストです。ドロップダウンリストのHtmlヘルパーはIEnumerable<SelectItem>を要求します。

その情報を私はこのようになりますHtmlHelper作成する場合さて、それはokです:

public static IEnumerable<SelectListItem> GetCountries(HtmlHelper htmlHelper) 
    { 
     return (from c in ((BaseController) htmlHelper.ViewContext.Controller).Entities.Countries 
       orderby c.Name 
       select new SelectListItem() {Text = c.Name, Value = c.ID}); 


    } 

Iそれが可能であれば問題はないが、それはのMVCの方法に応じて、[OK]の場合を物事をする。 (または、コントローラ内のViewDataに国のコレクションを置く必要がありますか?)

答えて

3

GetCountriesメソッドのパラメータとしてデータを渡します。 htmlHelper関数はあなたのベースコントローラのプロパティについて本当に知ってはいけません。もしあなたのベースから継承していないコントローラで誰かが使用していたらどうでしょうか?私が知っていることを知っている、あなたはコードを制御する、すごいよ。ベストプラクティスに本当に関心があるなら、依存関係を避けてください。

あなたのビューで、その後
public static IEnumerable<SelectListItem> GetCountries(this HtmlHelper html, Countries countries) { 
    return from c in countries 
      order by c.Name 
      select new SelectListItem 
      { 
       Text = c.Name, 
       Value = c.ID 
      }; 
} 

、:

<%=Html.GetCountries(this.Entities.Countries)%> 
+0

をrenderdropdown呼び出すしかし、どのように私は私のビューページ内の国で入手できますすることができます表示してコントローラが開始されたオブジェクトを渡すのだろうか? 私のViewPageの主な項目は、IEnumerable です。ですから、私は、CountriesコレクションをViewData(ViewData ["countries"])に入れなければなりません。 元のViewPageを継承し、Entitiesプロパティを追加する新しいViewPageを作成することを示唆しています(多くの依存性のようです)。 – Gidon

+3

都市と国の両方を保持するビューモデルを作成できます。 – Morph

+0

ViewModelは良いと思うこともありますが、多くのページがメインデータから構成され、余分なデータが含まれているため、すべてのページでそれを使用すると、非常に多くのViewModelが作成されています。 – Gidon

1

それはNerdDinnerチュートリアルで述べています、ViewModelにパターンをチェックアウト:http://nerddinnerbook.s3.amazonaws.com/Part6.htm

を基本的にあなたはすべてのデータをカプセル化するのViewModelクラスを作成しますあなたの意見を必要とするかもしれません。したがって、すべての都市および/または国のリストを含むクラスと、コントローラのアクションでインスタンス化された/実装されたその他のものがあります。

次に、ViewModelクラスを使用するようにビューを強く入力することができます。blammo:フォームに必要なすべてのデータがあります。

+1

私はViewModelパターンを知っており、場合によってはそれを使用しています。しかし、場合によってはそれは過度のものでもあります。私はたくさんの場所でこの国のリストを使用するつもりです。これは、ViewModelsのトンを作成しなければならないということを意味します。 – Gidon

+0

国を含む基本クラスを作る価値があり、必要なときに継承します。しかし、最終的には、ええ、あなたが多くの意見を持っているなら、あなたは多くのビューモデルを必要とします。また、私はこれをやっていないが、匿名の型をビューに渡してみると、ViewModelをすぐに作成できます。 –

0

私はhtmlヘルパーがhtmlを返すべきだと思います。 ですから、二つのアプローチがあります:あなたが始めとしてこれを実行したい場合は

...あなたのHtmlHelperから要素のリストを準備して、初期化されたリストでhtml.RenderDropDownを呼び出し、選択された要素など、

最初に

二つ目は、あなたはすべてのモデルに準備することができますので、あなたはあなたにとても必要なすべての要素は、あなたが直接

歓声

関連する問題