如何在MVC Html.DropDownList()中添加静态项目列表

GON*_*ale 14 .net c# asp.net asp.net-mvc html-helper

我想在ASP.NET MVC中SelectList()为a 分配静态项目列表,Html.DropDownList()最佳做法是什么?

我正打算尝试找到一种使用的方法new SelectList(new {key = "value"}...但是一种方法不起作用,而另外两种方法,如果我的静态列表ViewData无论如何被宣告并传递给我,我会在这里违反法律IList/IENumerable吗?

小智 23

最佳做法是不在视图中创建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();
Run Code Online (Sandbox Code Playgroud)

您传递给构造函数:IEnumerable对象,值字段文本字段和选定的值.

在视图中:

 <%=Html.DropDownList("list",ViewData["list"] as SelectList) %>
Run Code Online (Sandbox Code Playgroud)


Jul*_*tow 13

所有MVC新手最初都避免使用'M'字,但它确实从MVC首字母缩略词的开头开始.也许,也许,也许,你可能想用模型开始你的解决方案...只是说.

不要重复自己(干).您将最终复制并将"new PageData()"粘贴到将选项列表传递给View的每个Controller.然后,您将要删除或添加选项,并且必须编辑每个控制器的PageData.

此外,您希望使用最少的不必要的详细"添加","新","IS"和"名称"来键入最少量的代码.因为在选择选项(和/或单选按钮列表)中只有一个键值对,所以在模型中使用最轻的数据结构,即字典.

然后简单地在Controller中引用Model,并使用包含LINQ Lambda表达式的DropDownListFor将Dictionary转换为View中的SelectList.

吓倒?你不是一个人.我当然是.这是我用来自学M,V和C的一个例子:

MVC的Model部分:

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

Controller现在非常简单,只需传递模型即可.它避免了创建一个孤立的概念,它可能不仅仅与一个页面隔离:

public ActionResult Index()
{
   var model = new EzPL8.Models.MyEggs();
   return View(model);
}
Run Code Online (Sandbox Code Playgroud)

View使用DropDownListFor(而不是DropDownList)和Lambda表达式在事件重构中进行强类型化:

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

Voilà,由此产生的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>
Run Code Online (Sandbox Code Playgroud)

注意:不要混淆VALUE in <option value="6">,即词典中的Key,来自SelectList()中的"Value",它是在选项标签之间结束的文本/标题(例如Eggs Benedict).

使用案例:为了最大限度地减少应用程序和数据库之间的流量,我创建了一个静态列表,以避免数据库查询下拉列表很少(如果有的话)更改.然而,改变是不可避免的,从现在开始的六个月,我客户的餐厅就餐了; 不是因为绿色的火腿,而是因为它们对鸡蛋过敏而且厨师将其与华夫饼混合在一起.

餐厅需要更新他们的客户信息,立即包括食物过敏.虽然他们喜欢回头客,但他们并不酷,因为他们的信用卡被取消,死去的客户会因为无法付款的僵尸回来.

修辞问题:我是否应该修改与客户鸡蛋偏好相关的所有控制器和视图?或者只是将{7,"对鸡蛋过敏"}插入模型中?

另一个修辞问题:不是煎蛋吗?你想在模型中添加{8,"Omelette,Western"},{9,"Omelette,Mushroom-Feta-Spinach"}一次,并在所有使用它们的视图中的所有下拉列表中自动传播新增内容?

底线这可能比您要求的方式更多,...但您确实说过MVC,而不仅仅是VC:
1.在*M*VC中使用模型.2.当选择列表仅基于"主键"和标题时,在模型中使用字典.3.如果您的静态列表没有在某个地方使用数据库查找表,那么您的应用程序可能不是很有用.向静态列表添加选项时,您很可能还需要对Lookup表执行插入操作,以避免与数据库中的其他表发生主键/外键关系完整性错误.4.使用lambda和强类型数据结构来避免错误并获得预先支持.


GON*_*ale 3

好吧,我决定采纳自己的建议,这应该在控制器中定义:

仅供参考,我刚回来:

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);
Run Code Online (Sandbox Code Playgroud)

...(忽略上下文)并在 View ASPX 端:

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"...
Run Code Online (Sandbox Code Playgroud)

如果有人有更优化的方法来做到这一点,我将很乐意接受他们的答案。