質問

項目の静的なリストを割り当てたいと考えています。 SelectList()Html.DropDownList() ASP.NET MVC におけるベスト プラクティスは何ですか?

なんとか活用方法を探そうとしたところ、 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);

...(文脈を無視)して表示ASPX側でます:

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"...
誰もがこれを行うためのより最適な方法を持っている場合、私は自分の答えを受け入れるさせていただきます。

他のヒント

ビューで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をオブジェクト、値フィールドテキストフィールドと選択された値を

Viewでます:

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

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

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

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

次に、コントローラーでモデルを参照し、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"))

出来上がりの 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">, これは辞書からのキーであり、SelectList() の "Value" からのもので、テキスト/タイトル (例:エッグベネディクト)はオプションタグの間にあります。

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

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

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

もう一つの修辞的な質問:オムレツって卵じゃないの?{8, "Omelette, Western"}、{9, "Omelette, Mushroom-Feta-Spinach"} をモデルに一度追加し、新しい追加を、それらを使用するすべてのビューのすべてのドロップダウン リスト全体に自動的に反映させますか? ?

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top