2009-05-15 27 views
14

SelectList()のアイテムの静的リストをASP.NET MVCのHtml.DropDownList()に割り当てる場合は、どのような方法がベストですか?MVCのアイテムの静的リストを追加する方法Html.DropDownList()

私は動作しませんでしたこと、new SelectList(new {key = "value"}...が、1つを使用する方法を見つけようとしていた、と2、私はここに法律を破ることになるが、私の静的リストは、とにかくViewDataで宣言され、IList/IENumerableとして渡す必要がありますか?

答えて

3

OK私は自分自身の助言を取ることにしたが、これは、コントローラで定義する必要があります。...

PageData data = new PageData() 
      { 
       Formats = new[] 
          { 
           new { ID = "string", Name = "Text" }, 
           new { ID = "int", Name = "Numeric" }, 
           new { ID = "decimal", Name = "Decimal" }, 
           new { ID = "datetime", Name = "Date/Time" }, 
           new { ID = "timespan", Name = "Stopwatch" } 
          }, 
       ............. 

      }; 
return View(data); 

(文脈を無視する)とビューで:

FYI、私はちょうど戻りましたASPX側:誰もがこれを行うためのより最適な方法を持っている場合

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"... 

私は自分の答えを受け入れるさせていただきます。

+0

私は私が行ったものであるので私の答えを選択しました。 – GONeale

+0

これは正常に動作しますが、ドロップダウンで起動値としてDecimalをロードする場合はどうすればよいですか? – Sakthivel

23

ビューにSelectListを作成しないことをお勧めします。コントローラで作成し、ViewDataを使用して渡す必要があります。

例:

var list = new SelectList(new [] 
              { 
               new {ID="1",Name="name1"}, 
               new{ID="2",Name="name2"}, 
               new{ID="3",Name="name3"}, 
              }, 
          "ID","Name",1); 
      ViewData["list"]=list; 
      return View(); 

あなたは、コンストラクタに渡す:IEnumerableをオブジェクト、値フィールドテキストフィールドと選択した値。ビューの

<%=Html.DropDownList("list",ViewData["list"] as SelectList) %> 
+0

はMarwanと合意した。 SelectListオブジェクトを作成し、ビューに渡します。個人的には、私は強く型付けされたビューを持っていますが、それはこの質問の範囲外です。 –

+0

強く型付けされたビューを使用していますが、ビューでSelectListを定義するのはなぜですか?それは「視点に特有のもの」ですか?私は単にデータを公開するほうがいいと思います。つまり、あなたがビューを提供することを意図したものです。コンテキストやデータではありません。 – GONeale

+0

実際、私はそれが非常に間違っていると思う、SelectListは、完全にUI固有のドロップダウンリストをレンダリングするために使用されます。このデータをSelectListをサポートしていないチェックボックスリストなどに使用する場合はどうなりますか? – GONeale

11

すべてのMVCの初心者が最初に「M」の単語を避けるが、それはちょっとMVCの頭字語の初めに開始しません。だから多分、多分、あなたはモデルを使ってあなたのソリューションを始めたいと思うかもしれません。

Do not Repeat Yourself(DRY)。オプションリストをビューに渡すすべてのコントローラに「新しいPageData()」をコピーして貼り付けることになります。次に、オプションを削除または追加し、すべてのコントローラーのPageDataを編集する必要があります。

また、不必要に冗長な "追加"、 "新規"、 "IS"、 "名前"を最小限に抑えてコードを入力する必要があります。選択オプション(および/またはラジオボタンリスト)にはキーと値のペアしかないので、できるだけ軽いデータ構造、つまり辞書をモデルに使用してください。

単純にモデルをコントローラで参照し、LINQラムダ式を含むDropDownListForを使用して、ビュー内のSelectListに辞書を変換します。

威嚇?あなたは一人じゃない。私は確かにあった。

MVCのモデル部分:ここで私は自分自身にM、V、およびCを教えるために使用される例です

using System.Web.Security; 
using System.Collections.Generic; 
using System.Text; 
using System.Linq.Expressions; 
using System.Web.Routing; 
using System.Web.Helpers; 
using System.Web.Mvc.Html; 
using MvcHtmlHelpers; 
using System.Linq; 

// EzPL8.com is the company I work for, hence the namespace root. 
    // EzPL8 increases the brainwidths of waiters and bartenders by augmenting their "memories" with the identifies of customers by name and their food and drink preferences. 
    // This is pedagogical example of generating a select option display for a customer's egg preference. 

namespace EzPL8.Models  
{ 
    public class MyEggs  
    { 
     public Dictionary<int, string> Egg { get; set; } 

     public MyEggs() //constructor 
     { 
      Egg = new Dictionary<int, string>() 
      { 
       { 0, "No Preference"}, //show the complete egg menu to customers 
       { 1, "I hate eggs"}, //Either offer an alternative to eggs or don't show eggs on a customer's personalized dynamically generated menu 

       //confirm with the customer if they want their eggs cooked their usual preferred way, i.e. 
       { 2, "Over Easy"}, 
       { 3, "Sunny Side Up"}, 
       { 4, "Scrambled"}, 
       { 5, "Hard Boiled"}, 
       { 6, "Eggs Benedict"} 
      }; 
    } 
} 

コントローラは、ちょうどモデルを渡して、今非常に簡単です。それは単なる概念ではなく、単なる単なる概念ではありません。:

public ActionResult Index() 
{ 
    var model = new EzPL8.Models.MyEggs(); 
    return View(model); 
} 

ビューはDropDownListFor(代わりのDropDownListコントロール)を使用し、イベントのリファクタリングで強い型付けのためのラムダ式が必要です。

@Html.DropDownListFor(m => m.Egg, new SelectList(Model.Egg, "Key", "Value")) 

ほら、結果のHTML:

<select id="Egg" name="Egg"> 
<option value="0">No Preference</option> 
<option value="1">I hate eggs</option> 
<option value="2">Over Easy</option> 
<option value="3">Sunny Side Up</option> 
<option value="4">Scrambled</option> 
<option value="5">Hard Boiled</option> 
<option value="6">Eggs Benedict</option> 
</select> 

注:辞書からのキーである<option value="6">のVALUEと、テキスト/タイトル(例:Eggs Benedict)のSelectList()の "値"から混同しないでくださいhatはオプションタグの間で終わる。

ユースケース: は、私はめったに、もしこれまでに変更されないドロップダウンリストのためのデータベースクエリを避けるために、静的リストを作成したアプリケーションとデータベースの間のトラフィックを最小限に抑えるために。しかし、変化は避けられず、今から6ヶ月後に私の顧客のレストランで食堂が死ぬ。緑のハムのためではなく、彼らは卵にアレルギーがあり、料理人はワッフルでいくつかを混ぜたので。

レストランでは、食品アレルギーをすぐに反映するように顧客情報を更新する必要があります。彼らはリピート顧客を愛していますが、クレジットカードがキャンセルされたために支払う方法がないゾンビとして戻ってきた死んだ顧客が涼しいわけではありません。

修辞的質問:顧客の卵の選好に関連するすべてのコントローラとビューを変更する必要がありますか?または、{7、 "卵にアレルギー"}をモデルに挿入するだけですか?

もう1つの修辞的な質問:オムレツの卵はありませんか? {8、 "Omelette、Western"}、{9、 "Omelette、Mushroom-Feta-Spinach"}をモデルに一度追加して、新しい追加が自動的にすべてのドロップダウンリストに反映されるようにしますか?
1. * でモデルM * VC:

ボトムライン(S)これはおそらく、あなたが、のために尋ねた...しかし、あなたはMVCだけでなく、VCと言ったより道以上です。 2.選択リストが「プライマリキー」とタイトルだけに基づいている場合は、モデルで辞書を使用します。 3.静的リストがデータベースルックアップテーブルを使用していない場合、おそらくあまり役​​に立たないでしょう。静的リストにオプションを追加すると、データベース内の他のテーブルとの主キー/外部キー関係の完全性エラーを回避するために、ルックアップテーブルへの挿入を実行する必要があります。 4.ラムダと厳密に型指定されたデータ構造を使用して、エラーを回避し、先読みサポートを取得します。

+0

すべての 'EzPL8'リファレンスは何ですか?私は失われている...または私は冗談を逃している? –

+1

-1のEzPL8ストーリーです。 +1はモデルからデータを引き出すためのものです。 –

関連する問題