web-dev-qa-db-ja.com

MVC Html.DropDownList()にアイテムの静的リストを追加する方法

SelectList()のアイテムの静的リストをASP.NETMVCのHtml.DropDownList()に割り当てたいのですが、ベストプラクティスは何ですか?

new SelectList(new {key = "value"}...を使用する方法を見つけようとしていましたが、1つは機能せず、2つは、静的リストがViewDataで宣言された場合、ここで法律に違反することになります。 IList/IENumerableとして渡されますか?

14
GONeale

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);

...(コンテキストを無視)およびView ASPX側:

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

誰かがこれを行うためのより最適な方法を持っているなら、私は彼らの答えを喜んで受け入れます。

3
GONeale

ビューに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) %>
23
user434917

すべてのMVC初心者は、最初は「M」ワードを避けますが、MVCの頭字語の先頭から始まります。だから、たぶん、たぶん、あなたはモデルからソリューションを始めたいと思うかもしれません...ただ言っているだけです。

自分を繰り返さないでください(DRY)。オプションリストをビューに渡すすべてのコントローラーに「newPageData()」をコピーして貼り付けることになります。次に、オプションを削除または追加し、すべてのコントローラーのPageDataを編集する必要があります。

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

次に、コントローラーでモデルを参照し、LINQ Lambda式を含むDropDownListForを使用して、ディクショナリをビューのSelectListに変換します。

怖い?あなたは一人じゃない。私は確かにそうだった。これは私が自分自身にM、V、Cを教えていた例です:

MVCのモデル部分:

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"}
            };
    }
}

コントローラは、モデルを渡すだけで、かなりシンプルになりました。おそらく1ページだけに分離されていない分離された概念の作成を回避します。

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

ビューは(DropDownListの代わりに)DropDownListForを使用し、リファクタリングが必要な場合に強い型付けを行うためにLambda式を使用します。

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

Voilà、結果の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()の「Value」と混同しないでください。オプションタグの間。

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

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

修辞的な質問:顧客の卵の好みに関連するすべてのコントローラーとビューを変更する必要がありますか?または、単に{7、 "Allergic to Eggs"}をモデルに挿入しますか?

別のレトリックの質問:オムレツは卵ではありませんか? {8、 "Omelette、Western"}、{9、 "Omelette、Mushroom-Feta-Spinach"}をモデルに1回追加し、それらを使用するすべてのビューのすべてのドロップダウンリストに新しい追加を自動的に伝播させますか? ?

ボトムラインこれはおそらくあなたが要求したよりもはるかに多いです...しかしあなたはVCだけでなくMVCと言いました:
1。 *[〜#〜] m [〜#〜]* VCでモデルを使用します。 2.選択リストが「主キー」とタイトルのみに基づいている場合は、モデルで辞書を使用します。 3.静的リストがどこかのデータベースルックアップテーブルと一致しない場合、アプリはおそらくあまり役​​に立ちません。静的リストにオプションを追加する場合、データベース内の他のテーブルとの主キー/外部キーの関係整合性エラーを回避するために、ルックアップテーブルへの挿入も実行する必要がある可能性があります。 4.ラムダと強く型付けされたデータ構造を使用して、エラーを回避し、先行入力のサポートを取得します。

13
Jules Bartow