【问题标题】:How to write a simple Html.DropDownListFor()?如何编写一个简单的 Html.DropDownListFor()?
【发布时间】:2010-06-16 23:21:03
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc-2 html.dropdownlistfor


    【解决方案1】:

    请参阅 this MSDN articleexample usage here on 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")) %>
    

    【讨论】:

    • 真的很清楚。我想知道我应该将 IEnumerable 放在我的代码中的什么位置?我知道这个问题看起来很愚蠢,但我很迷茫并且很陌生:s
    • 别担心,朋友。我知道那是什么感觉。 :) 正如您在最初的问题中所建议的,这是您要在代码中创建的静态列表,还是要从数据库中提取此列表?
    • 一个静态列表,其中包含 4 个选项,而不是来自数据库
    • 创建一个名为“HtmlLists”之类的静态类。将静态类放在 System.Web.Mvc 命名空间中。在您的静态类中,添加 IEnumerable 颜色的静态列表。然后,在您看来,您可以通过调用 HtmlLists.Colors 来引用它。希望这是有道理的。让我知道。 :)
    • 我不知道该怎么做.还有一个不知道如何将liste的结果放在viewModel的属性中..我很困惑:/
    【解决方案2】:
    <%: 
         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
               )
            )
    %>
    

    或者你可以不写类,直接把这样的东西放到视图中。

    【讨论】:

    • 我在尝试您的代码时收到以下错误:“对象引用未设置为对象的实例。”
    • 向视图添加模型逻辑的坏主意
    【解决方案3】:

    从模型中的字典开始避免大量的指法

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

    【讨论】:

      【解决方案4】:

      您好,这是我在一个项目中的做法:

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

      我希望它可以帮助某人。谢谢

      【讨论】:

        【解决方案5】:

        或者,如果它来自数据库上下文,您可以使用

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

        【讨论】:

        • 首先,很抱歉任何语法错误,因为英语不是我的第一语言。看到有人做出如此深思熟虑的评论总是很高兴,先生,我为您花时间做出贡献而为您鼓掌。开发人员的职业掌握在您这样的好手中,这也总是令人放心,因为我不会这样做。喜欢你无知的评论是我不再在这里发帖的原因。我可以告诉你,当我写这篇文章时,我接受了 8 个月的教育,之前从未接触过 Web 开发。我想用我所拥有的一点知识来分享一种不同的方法。
        • 8 个月?那么,当您不知道如何解决问题时,为什么还要尝试解决问题呢?我的评论远非无知,我日复一日地看到这些东西。您必须开始考虑您对同事的体力劳动量。假设您有一个具有数百个视图的企业应用程序,而您的 CTO 想要切换到 Oracle DB。想象一下,仅仅因为您的一行代码就重构所有使用下拉列表的视图和控制器的实际成本!我不是想侮辱你,只是想向你解释一点不好的建议如何产生巨大的影响。
        • 与需要重构基于静态枚举的解决方案没有什么不同。至少每次企业想要向列表中添加颜色时,它都不是代码更改。如果有更多的人考虑实际使用数据库,世界将会变得更美好。
        • @m12lrpv 你错了伙计。我会给你一个具体的例子,让事情更清楚。视图意味着可重复使用,如果我有一个视图在页面上重复 n 次,那就是 n 调用数据库以获取您已输入查询以获取选项的每个下拉列表。现在,如果我们将其抽象为 ViewModel,我们可以将其减少到 1 个数据库调用,无论我们想要多少视图。这是在数据源发生变化时不必遍历所有视图的明显可维护性优势之前。 “.net 开发人员非常害怕数据库”——什么?
        • 嗯,当我每隔一段时间访问它时,这个线程会给我带来微笑。我对@SeanT 的理解更好一点。我想当我试图提供帮助时,我只是感到一般的攻击。我现在更喜欢自己将所有内容按层分开,并且不让任何东西接触视图,除非它被分成 ViewModels。这正是我喜欢自己做的方式。我感谢 m12lrpv 带我为你辩护:-)
        【解决方案6】:

        使用“请选择一项”

        @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/1395101JaredPar

        感谢 Master Programmer && Joel Wahlund && JaredPar ;

        祝朋友们好运。

        【讨论】:

          【解决方案7】:
          @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'、'model'、'm' 等。
          • 用户将在下拉列表中看到的占位符是“选择一个选项”,因此您可以根据需要进行更改。
          • 下拉菜单前面有一段文字,上面写着“你喜欢披萨吗?”
          • 我认为这应该是表单的完整文本,包括提交按钮

          希望这对某人有所帮助,

          【讨论】:

            猜你喜欢
            • 2010-11-16
            • 2012-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多