14

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

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

4

3 に答える 3

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) %>
于 2009-05-15T06:17:42.837 に答える
13

すべての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と、オプションタグの間にあるテキスト/タイトル(エッグベネディクトなど)であるSelectList()の「値」と 混同しないでください。

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

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

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

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

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

于 2012-05-01T15:10:29.327 に答える
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);

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

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

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

于 2009-05-15T06:05:31.417 に答える