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

Rin*_*sse 128 c# asp.net html.dropdownlistfor asp.net-mvc-2

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

Eva*_*gle 181

请参阅此MSDN文章以及Stack Overflow上示例用法.

假设您有以下Linq/POCO课程:

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

让我们说你有以下模型:

public class PageModel 
{
   public int MyColorId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

最后,让我们说你有以下颜色列表.它们可以来自Linq查询,来自静态列表等:

public static IEnumerable<Color> Colors = new List<Color> { 
    new Color {
        ColorId = 1,
        Name = "Red"
    },
    new Color {
        ColorId = 2,
        Name = "Blue"
    }
};
Run Code Online (Sandbox Code Playgroud)

在您的视图中,您可以创建一个下拉列表,如下所示:

<%= Html.DropDownListFor(n => n.MyColorId, 
                         new SelectList(Colors, "ColorId", "Name")) %>
Run Code Online (Sandbox Code Playgroud)

  • 不用担心,朋友.我知道它的感受.:)正如您在初始问题中所建议的那样,这是一个静态列表,您将在代码中创建,还是要从数据库中提取此列表? (6认同)
  • 创建一个名为"HtmlLists"的静态类.将静态类放在System.Web.Mvc命名空间中.在静态类中,添加IEnumerable <Color> Colors的静态列表.然后,在您的视图中,您可以通过调用HtmlLists.Colors来引用它.希望有道理.让我知道.:) (6认同)
  • 我不知道怎么做:'(...我不知道在哪里放置Color classe和HtmlLists(在模型文件夹中可能是?)以及如何在视图中引用.也不知道怎么放在viewModel的属性中侦听的结果.我很困惑:/ (2认同)

小智 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
           )
        )
%>
Run Code Online (Sandbox Code Playgroud)

或者你不能写任何类,把这样的东西直接放到视图中.

  • 在您的视图中添加模型逻辑的坏主意 (10认同)
  • 我在尝试您的代码时收到以下错误:"对象引用未设置为对象的实例." (2认同)

Jul*_*tow 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"}
            };

    }


    }
Run Code Online (Sandbox Code Playgroud)

在视图中将其转换为列表以供显示

@Html.DropDownListFor(m => m.Egg.Keys,
                         new SelectList(
                             Model.Egg, 
                             "Key", 
                             "Value"))
Run Code Online (Sandbox Code Playgroud)


小智 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"})
Run Code Online (Sandbox Code Playgroud)

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


Joe*_*und 12

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

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

  • 请不要鼓励这种废话.如果您想在您的Razor视图中引用您的数据库上下文,但对于我们这些喜欢以正确的方式构建软件的人来说,这是一个糟糕的主意.将Razor视图绑定到视图模型类,视图所需的任何数据都存储在控制器创建的视图模型的实例中.这是我离开.Net的原因的一部分,太多可怕的开发人员用他们的代码做了可怕的事情,给其他人带来了巨大的麻烦.我打赌你把所有的业务逻辑放在你的控制器中! (21认同)
  • 首先,抱歉任何语法错误,因为英语不是我的第一语言.看到有人做出如此思考的评论总是很高兴,我赞赏你,先生,你花时间做出贡献.它也总是让人放心,开发人员的职业与你的一样好,因为我不会这样做.你无知的评论就是为什么我再也不会在这里发帖了.我可以告诉你,当我写这篇文章的时候,我已经接受了8个月的教育,并且从未接触过Web开发.我希望与我所掌握的一点点知识分享不同的方法. (7认同)
  • 8个月?那么为什么当你不知道怎么解决问题呢?我的评论远非无知,我日复一日地看到这些东西.您必须开始考虑您对同事负责的手工工作量.想象一下,你有一个拥有数百个视图的企业应用程序,你的CTO想要切换到Oracle DB.想象一下,由于你的一行代码,重构使用下拉列表的所有视图和控制器的文字成本!我不是想侮辱你,只是试图向你解释一个不好的建议会产生巨大的影响. (7认同)
  • 好吧,当我偶尔访问它时,这条线会给我带来微笑。我更能理解@SeanT 的观点了。我想当我试图提供帮助时,我只是感受到了攻击。现在,我更喜欢将所有内容按层分开,并且不让任何内容接触视图,除非将其分成 ViewModel。这正是我喜欢自己做的方式。我很感激 m12lrpv 为我辩护:-) (5认同)
  • 与需要重构基于静态枚举的解决方案没有什么不同.每次企业想要在列表中添加颜色时,至少不是代码更改.如果有更多的人想到实际使用数据库,世界将是一个更好的地方. (2认同)
  • @m12lrpv 您完全忽略了 JBeckton 的观点-他说如果您从数据库获取数据,则添加其他层,以便在视图中不引用数据库 (2认同)
  • @m12lrpv 一般来说我同意,但当开发人员缺乏经验时则不同意,就像这里的情况一样。它只是为更有经验的开发人员在以后的重构中进一步创造工作。在任何严肃的应用程序中,您都不会在视图中引用数据库。 (2认同)
  • @m12lrpv 你错了,伙计。我会给你一个具体的例子,让事情变得更清楚。视图应该是可重用的,如果我有一个视图在页面上重复“n”次,那就是对数据库的“n”次调用,用于您在其中放入查询以获取选项的每个下拉列表。现在,如果我们将其抽象为 ViewModel,则可以将其减少到 1 个数据库调用,无论我们想要多少个视图。这是在讨论明显的可维护性优势之前的情况,即如果数据源发生变化,则不必遍历所有视图。“.net 开发人员非常害怕数据库”——什么? (2认同)

Ami*_*eri 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" })  
Run Code Online (Sandbox Code Playgroud)

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

谢谢首席程序员 && Joel Wahlund && JaredPar ;

祝你好运的朋友。