2010-11-20 24 views
10

ASP.NET MVCで一般的に使用されるドロップダウンリストを作成するときのベストプラクティスは何か不思議でした。たとえば、自分のアプリケーションで頻繁に使用される国と州の選択肢があります。私はそのようなドロップダウンリストを保持したいすべての単一のビューのために、私のコントローラからそのビューモデルにバインドしてビューモデルを作成するのは汚いようです。ASP.NET MVC - 一般的に使用されるドロップダウンリストを作成する

このような場合、どのようにユーザーが自分のドロップダウンリストを作成しますか? - これでベースとカスタムbaseclass?ヘルパークラスなど?事前に

おかげで、

JP

答えて

7

:代わりに私は、状態を取得するようなものをロジックを集中したいです。

public class RequiresStateList : ActionFilterAttribute { 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["StateList"] = GetStates(); 
    } 
} 

そして、あなたの行動

[RequiresStateList] 
public ActionResult Index() { 
    return View(); 
} 

今、あなたはあなたのビューでのViewDataからそのリストを取得することができます。

+0

なぜ私は考えなかったのか分かりませんこれはエレガントで再利用可能なソリューションです。ありがとう! –

+0

@JP、あなたは大歓迎です:) –

+1

冗談で、これがサンダードームの原則に違反していると宣言します! – Merritt

3

カスタムHTMLヘルパーが移動するための方法です...

http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs

+0

非常にエレガント:モデルもビューも膨らんでいません。ビュー内の*コード*はエレガントで再利用可能です。 HtmlHelperは個別にユニットテストすることができます。 –

+0

私はこの解決策をモデルに持たせるのが好きです。このモデルでは、データが移入/送信されるデータにモデルを保存することをお勧めします。この場合は、値の完全なリストではなく選択された値になります。これらはまた、あなたのビューテンプレートがDispalyForテンプレートのために選択された値の 'Text'プロパティを取得できるようにするために便利です(Valueプロパティが選択された値と一致するTextプロパティを取得します)。 –

+0

HTMLヘルパーをDALで拡張するとMVCアーキテクチャが壊れます。ビューをダミーにするのではなく、データレイヤーに呼び出すためです。 MVCアーキテクチャを壊すことは必ずしも悪いことではありません。 – Yorro

0

私は(一致するビューモデルを作成するための大ファンですモデル)を正確に表示します。したがって、州のドロップダウンリストを持つビューがある場合、そのページのビューモデルには、ListItemのStatesコレクションがあります。

ステートコレクションを持つモデルを表示することについて心配しません。あなたがそれを必要とするアクションにその共通の機能を注入するRequiresStateList属性を持つことができ

viewModel.States = StatesHelper.GetStates(); // returns IList<ListItem> 
+0

このアプローチについて興味深い議論があります:http://mikehadlow.blogspot.com/2010/10/populating-drop-down-lists-in-aspnet.html – Merritt

関連する問題