如何编写一个简单的Html.DropDownListFor()?


133

在ASP.NET MVC 2中,我想编写一个非常简单的下拉列表,其中提供了静态选项。例如,我想在“红色”,“蓝色”和“绿色”之间进行选择。

Answers:


188

请参阅MSDN文章此处的Stack Overflow示例用法

假设您具有以下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>放在哪里?我知道这似乎是个愚蠢的问题,但是我很迷茫,也很
陌生

7
不用担心,朋友。我知道感觉如何。:)正如您在最初的问题中所建议的那样,这是要在代码中创建的静态列表,还是要从数据库中提取此列表?
Evan Nagle 2010年

包含4个未生成数据库的选项的静态列表
Rinesse 2010年

6
创建一个称为“ HtmlLists”的静态类。将静态类放在System.Web.Mvc命名空间中。在您的静态类中,添加IEnumerable <Color>颜色的静态列表。然后,在您的视图上,可以通过调用HtmlLists.Colors引用它。希望有道理。让我知道。:)
Evan Nagle 2010年

2
我不知道该怎么做:'(...我不知道将Color classe和HtmlLists放在哪里(可能在models文件夹中?),以及如何在视图中进行引用。我很困惑:/
Rinesse 2010年

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
在尝试您的代码时,我收到以下错误消息:“对象引用未设置为对象的实例。”
巴沙尔·阿布·莎玛

12
坏主意模型逻辑添加到您的视图
丹尼尔TULP

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

嗨,这是我在一个项目中的工作方式:

     @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视图中引用数据库上下文,但对于喜欢构建软件的正确方法的人来说,这是一个糟糕的主意。将Razor视图绑定到视图模型类,该视图所需的任何数据都存储在控制器创建的视图模型的实例中。这是我远离.Net的原因的一部分,太多可怕的开发人员用他们的代码来做可怕的事情,这使其他所有人都感到头疼。我敢打赌,您将所有业务逻辑都放入了控制器中!
JBeckton '16

7
首先,对于任何语法错误,抱歉,因为英语不是我的母语。看到有人发表这样的深思熟虑的评论总是很高兴的,先生,我很高兴您花了一些时间做出贡献。总是可以放心的是,开发人员的职业掌握在您的手中,因为我的职业不会。您无知的评论之类的原因是我不再在这里发布的原因。我可以告诉你,当我写这篇文章的时候,我受了八个月的教育,从未接触过Web Development。我想以我所知不多的方式分享另一种方法。
Joel Wahlund

7
8个月?那为什么不知道怎么解决问题呢?我的评论远非无知,我日复一日地看到这些东西。您必须开始考虑要承担给同事的手工工作量。想象您有一个具有数百个视图的企业应用程序,而您的CTO希望切换到Oracle DB。想象一下,仅仅因为一行代码,重构使用下拉列表的所有视图和控制器的实际成本!我并不是要侮辱您,只是想向您解释一点不好的建议会产生怎样的巨大影响。
JBeckton '16

2
与重构基于静态枚举的解决方案没什么不同。至少在每次企业要向列表中添加颜色时,这并不是代码更改。如果更多的人考虑实际使用数据库,那么世界将会是一个更好的地方。
m12lrpv

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

从代码派生而来:Master Programmer && Joel Wahlund ;
国王参考:https: //stackoverflow.com/a/1528193/1395101 JaredPar ;

谢谢首席程序员 && Joel 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" />
} 

我认为这个答案与培拉特的答案相似,因为您将DropDownList的所有代码直接放在视图中。但是我认为这是创建ay / n(布尔值)下拉列表的有效方法,因此我想与他人分享。

初学者注意事项:

  • 不用担心“ x”是什么意思-它是第一次在此处创建的,并且不会链接到MVC应用中其他任何地方,因此您可以将其命名为“ x”, '型号','米'等
  • 用户在下拉列表中将看到的占位符是“选择一个选项”,因此您可以根据需要更改此占位符。
  • 下拉菜单前有一段文字说“你喜欢披萨吗?”
  • 我认为这应该是表单的完整文本,包括提交按钮

希望这对某人有帮助,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.