MVC Html.DropDownList() に項目の静的リストを追加する方法
-
22-08-2019 - |
質問
項目の静的なリストを割り当てたいと考えています。 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.ラムダと厳密に型指定されたデータ構造を使用して、エラーを回避し、先行入力のサポートを取得します。