単純なHtml.DropDownListFor()を書く方法は?


133

ASP.NET MVC 2では、静的オプションを提供する非常にシンプルなドロップダウンリストを記述したいと思います。たとえば、「赤」、「青」、「緑」の選択肢を提供したいと思います。

回答:


188

こちらのStack OverflowでこのMSDNの記事使用例をご覧ください。

次のLinq / POCOクラスがあるとします。

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
}

また、次のモデルがあるとします。

public class PageModel 
{
   public int MyColorId { get; set; }
}

最後に、次の色のリストがあるとします。それらは、Linqクエリ、静的リストなどから取得できます。

public static IEnumerable<Color> Colors = new List<Color> { 
    new Color {
        ColorId = 1,
        Name = "Red"
    },
    new Color {
        ColorId = 2,
        Name = "Blue"
    }
};

ビューでは、次のようなドロップダウンリストを作成できます。

<%= Html.DropDownListFor(n => n.MyColorId, 
                         new SelectList(Colors, "ColorId", "Name")) %>

1
それは本当に明確です。コードのどこにIEnumerable <Color>を配置すればよいですか?私はそれが質問としてばかげているように見えるのを知っています、しかし私はそれで非常に迷っていて新しいです:s
Rinesse

7
心配しないで、友達。私はそれがどのように感じているかを知っています。:)最初の質問で提案したように、これはコードで作成する静的リストですか、それともデータベースからこのリストをプルするのですか?
Evan Nagle

データベースを削除しない4つのオプションを含む静的リスト
Rinesse

6
「HtmlLists」などと呼ばれる静的クラスを作成します。静的クラスをSystem.Web.Mvc名前空間に配置します。静的クラスで、IEnumerable <Color> Colorsの静的リストを追加します。次に、ビューで、HtmlLists.Colorsを呼び出してそれを参照できます。それが理にかなっていると思います。お知らせ下さい。:)
Evan Nagle

2
私はそれを行う方法を知りませんでした: '(... ColorクラスとHtmlListsをどこに配置するか(モデルフォルダー内にある可能性がありますか?)とビューで参照する方法がわかりません。 viewModelの属性にあるリストの結果..混乱しています:/
Rinesse

61
<%: 
     Html.DropDownListFor(
           model => model.Color, 
           new SelectList(
                  new List<Object>{ 
                       new { value = 0 , text = "Red"  },
                       new { value = 1 , text = "Blue" },
                       new { value = 2 , text = "Green"}
                    },
                  "value",
                  "text",
                   Model.Color
           )
        )
%>

または、クラスを記述せずに、このようなものを直接ビューに配置することもできます。


2
コードを試すと、「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」というエラーが表示されます。
Bashar Abu Shamaa

12
モデルロジックをビューに追加するのは悪い考え
ダニエルタルプ

34

モデルのディクショナリから開始することにより、脂肪の多い運指を避ける

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

        public MyEggs()
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},
                { 1, "I hate eggs"},
                { 2, "Over Easy"},
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };

    }


    }

ビューで、表示用のリストに変換します

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

32

こんにちはここに私が1つのプロジェクトでそれをどのようにしたかがあります:

     @Html.DropDownListFor(model => model.MyOption,                
                  new List<SelectListItem> { 
                       new SelectListItem { Value = "0" , Text = "Option A" },
                       new SelectListItem { Value = "1" , Text = "Option B" },
                       new SelectListItem { Value = "2" , Text = "Option C" }
                    },
                  new { @class="myselect"})

誰かのお役に立てば幸いです。ありがとう


12

または、それが使用できるデータベースコンテキストからのものである場合

@Html.DropDownListFor(model => model.MyOption, db.MyOptions.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }))

22
この種のナンセンスを奨励しないでください。自分のRazorビューでdbコンテキストを参照したいが、ソフトウェアを正しい方法で構築したいという人にとって、これはひどい考えです。Razorビューをビューモデルクラスにバインドします。ビューに必要なデータは、コントローラーによって作成されたビューモデルのインスタンスに格納されます。これが私が.Netから離れようとしている理由の1つです。非常に多くの恐ろしい開発者がコードを使ってひどいことをしているため、他の人にとっては大きな頭痛の種となっています。すべてのビジネスロジックをコントローラーに配置したに違いありません。
JBeckton 2016

7
まず第一に、英語は私の第一言語ではないため、文法の誤りについては申し訳ありません。誰かがこのようなよく考え抜かれたコメントをするのを見るのはいつもうれしいことです。あなたが貢献するのに時間をかけたことをあなたに感謝します。また、私の仕事はうまくいかないので、開発者の専門職があなたのような優れた手に渡っていることも常に心強いことです。あなたの無知なコメントのようなものは、私がもうここに投稿しない理由です。私がこれを書いたとき、私は教育を受けてから8か月で、事前にWeb開発に触れたことはありませんでした。私は私が持っていた少しの知識で別のアプローチを共有したいと思いました。
Joel Wahlund、2016

7
8ヶ月で?では、どうしてわからないときに問題を解決しようとするのでしょうか。私のコメントは無知には程遠いです、私は毎日これを毎日見ています。同僚に義務付けている手作業の量を検討する必要があります。何百ものビューを持つエンタープライズアプリケーションがあり、CTOがOracle DBに切り替えたいとします。たった1行のコードのために、ドロップダウンリストを使用するすべてのビューとコントローラーをリファクタリングするための文字通りのコストを想像してみてください。私はあなたを侮辱しようとするのではなく、ちょっと悪いアドバイスがいかに大きな影響を与えることができるかをあなたに説明しようとするだけです。
JBeckton

2
静的列挙型ベースのソリューションをリファクタリングする必要があることと違いはありません。少なくとも、企業がリストに色を追加するたびにコードを変更する必要はありませんでした。より多くの人々が実際にデータベースを使用することを考えた場合、世界はより良い場所になるでしょう。
m12lrpv 2017年

3
さて、このスレッドは、たまに訪れると笑顔になります。@SeanTポイントがもう少し良くなることを理解しています。私が助けようとしたとき、私は一般的に攻撃を感じたと思います。すべてをレイヤーで分離し、ViewModelsに分離されない限り、ビューに何も触れさせないようにしたいのです。それは私が自分でやるのが好きな方法です。私はあなたを守ってくれたm12lrpvに感謝します:-)
Joel Wahlund

7

「一つ選んでください」と

@Html.DropDownListFor(model => model.ContentManagement_Send_Section,
  new List<SelectListItem> { new SelectListItem { Value = "0", Text = "Plese Select one Item" } }
    .Concat(db.NameOfPaperSections.Select(x => new SelectListItem { Text = x.NameOfPaperSection, Value = x.PaperSectionID.ToString() })),
  new { @class = "myselect" })  

コードから派生:マスタープログラマー && Joel Wahlund ;
キングリファレンス:https : //stackoverflow.com/a/1528193/1395101 JaredPar ;

おかげでマスタープログラマー && ジョエルWahlund && JaredPar

幸運のお友達。


1
@using (Html.BeginForm()) {
    <p>Do you like pizza?
        @Html.DropDownListFor(x => x.likesPizza, new[] {
            new SelectListItem() {Text = "Yes", Value = bool.TrueString},
            new SelectListItem() {Text = "No", Value = bool.FalseString}
        }, "Choose an option") 
    </p>
    <input type = "submit" value = "Submit my answer" />
} 

この答えはBeratの答えに似ていると思います。DropDownListのすべてのコードを直接ビューに配置します。しかし、これはy / n(ブール)ドロップダウンリストを作成する効率的な方法だと思うので、共有したいと思いました。

初心者向けの注意事項:

  • 「x」が何と呼ばれるかを気にする必要はありません。これは初めてここで作成され、MVCアプリ内の他のどこにもリンクされないため、好きなものを呼び出すことができます-「x」、 「モデル」、「m」など
  • ユーザーがドロップダウンリストに表示するプレースホルダーは「オプションを選択」であるため、必要に応じてこれを変更できます。
  • ドロップダウンの前に「ピザは好きですか?」と書かれた少しのテキストがあります。
  • これは、送信ボタンを含むフォームの完全なテキストである必要があると思います

これが誰かを助けることを願って、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.