【问题标题】:How can I add an item to a SelectList in ASP.net MVC如何在 ASP.net MVC 中将项目添加到 SelectList
【发布时间】:2021-01-25 22:36:11
【问题描述】:

基本上,我希望在 SelectList 的开头插入一个默认值为 0 且文本值为“--Select One --”的项目

类似

SelectList list = new SelectList(repository.func.ToList());
ListItem li = new ListItem(value, value);
list.items.add(li);

这个可以吗?

【问题讨论】:

  • SelectList 似乎只是将数据直接绑定到项目的助手。如果您手动添加项目,请改用List<SelectListItem>
  • 鉴于接受的答案和票数,我是否建议您稍微更改问题以反映该答案,即“如何在 ASP.net 中向 SelectList 添加空白值项MVC”?但是感谢@h-dog 回答了原始的“我如何添加项目”本身的问题

标签: asp.net-mvc selectlist


【解决方案1】:

除非您坚持值为 0,否则实际上不需要这样做。HtmlHelper DropDownList 扩展允许您设置一个选项标签,该标签显示为带有空值的选择中的初始值。只需使用具有选项标签的 DropDownList 签名之一。

<%= Html.DropDownList( "DropDownValue",
                       (IEnumerable<SelectListItem>)ViewData["Menu"],
                        "-- Select One --" ) %>

【讨论】:

  • 如果你真的坚持值 0 怎么办?如果值为 null/空字符串,可能会导致模型绑定出现问题。
  • 如果您希望它返回为 int,那么我会使用 int?如果没有进行任何选择,仍将其保留为空。
  • 这个解决方案的问题是您丢失了您选择的项目。
  • @JesseWebb 我怀疑您只需要确保您使用的签名包含选项标签,例如msdn.microsoft.com/en-us/library/ee703567.aspx@Html.DropDownListFor( m =&gt; m.MenuSelection, (IEnumerable&lt;SelectListItem&gt;)ViewBag.Menu, "Select One", null ),包括空值htmlAttributes,以避免与采用表达式、菜单枚举和对象 (htmlAttributes) 的签名。
  • @tvanfosson - 感谢您的澄清。我尝试将它与 Complex 类型一起用作 SelectList 中 IEnumerable 的类型。我必须指定dataValueFielddataTestField,这使得在添加optionLabel 值时这不起作用。它可能需要付出更多的努力,但我只是使用了其中一种替代解决方案。不过还是谢谢!
【解决方案2】:

我通过填充一个 SelectListItem、转换为一个列表并在索引 0 处添加一个值来实现此功能。

List<SelectListItem> items = new SelectList(CurrentViewSetups, "SetupId", "SetupName", setupid).ToList(); 
items.Insert(0, (new SelectListItem { Text = "[None]", Value = "0" }));
ViewData["SetupsSelectList"] = items;

【讨论】:

  • 我推荐在 HtmlHelper 中使用 optionLabel 重载 -> @Html.DropDownListFor
【解决方案3】:

这是可能的。

//Create the select list item you want to add
SelectListItem selListItem = new SelectListItem() { Value = "null", Text = "Select One" };

//Create a list of select list items - this will be returned as your select list
List<SelectListItem> newList = new List<SelectListItem>();

//Add select list item to list of selectlistitems
newList.Add(selListItem);

//Return the list of selectlistitems as a selectlist
return new SelectList(newList, "Value", "Text", null);

【讨论】:

  • 我推荐在 HtmlHelper 中使用 optionLabel 重载 -> @Html.DropDownListFor
  • 如果你从一个已经有项目的SelectList 开始,就像在 OP 的情况下,还需要以下行来保留这些项目:newList.AddRange(myOriginalSelectList)。跨度>
【解决方案4】:

我喜欢@AshOoO 的回答,但就像@Rajan Rawal 一样,我需要保留选定项目的状态(如果有的话)。所以我将我的自定义添加到他的方法AddFirstItem()

public static SelectList AddFirstItem(SelectList origList, SelectListItem firstItem)
{
    List<SelectListItem> newList = origList.ToList();
    newList.Insert(0, firstItem);

    var selectedItem = newList.FirstOrDefault(item => item.Selected);
    var selectedItemValue = String.Empty;
    if (selectedItem != null)
    {
        selectedItemValue = selectedItem.Value;
    }

    return new SelectList(newList, "Value", "Text", selectedItemValue);
}

【讨论】:

  • 我推荐在 HtmlHelper 中使用 optionLabel 重载 -> @Html.DropDownListFor
【解决方案5】:
private SelectList AddFirstItem(SelectList list)
        {
            List<SelectListItem> _list = list.ToList();
            _list.Insert(0, new SelectListItem() { Value = "-1", Text = "This Is First Item" });
            return new SelectList((IEnumerable<SelectListItem>)_list, "Value", "Text");
        }

这应该可以满足您的需要,只需发送您的选择列表,它将返回一个选择列表,其中包含索引 0 中的项目

您可以自定义需要插入的项目的文本、值甚至索引

【讨论】:

  • 如果我有一些选定的值并且我想保留它们怎么办?
  • 我推荐在 HtmlHelper 中使用 optionLabel 重载 -> @Html.DropDownListFor
【解决方案6】:

这里为您提供 html 助手

public static SelectList IndividualNamesOrAll(this SelectList Object)
{
    MedicalVarianceViewsDataContext LinqCtx = new MedicalVarianceViewsDataContext();

    //not correct need individual view!
    var IndividualsListBoxRaw =  ( from x in LinqCtx.ViewIndividualsNames 
                                 orderby x.FullName
                                 select x);

    List<SelectListItem> items = new SelectList (
                               IndividualsListBoxRaw, 
                              "First_Hospital_Case_Nbr", 
                              "FullName"
                               ).ToList();

    items.Insert(0, (new SelectListItem { Text = "All Individuals", 
                                        Value = "0.0", 
                                        Selected = true }));

    Object = new SelectList (items,"Value","Text");

    return Object;
}

【讨论】:

    【解决方案7】:

    .ToList().Insert(..) 方法将一个元素放入您的列表中。可以指定任何位置。在 ToList 之后只需添加 .Insert(0, "- - First Item - -")

    您的代码

    SelectList list = new SelectList(repository.func.ToList());
    

    新代码

    SelectList list = new SelectList(repository.func.ToList().Insert(0, "- - First Item - -"));
    

    【讨论】:

    • SelectList.Items 没有 Add() 方法。
    【解决方案8】:

    听起来可能不太优雅,但我通常会这样做:

        var items = repository.func.ToList();
        items.Insert(0, new funcItem { ID = 0, TextValue = "[None]" });
        ViewBag.MyData = new SelectList(items);
    

    【讨论】:

      【解决方案9】:

      好的,我喜欢干净的代码,所以我把它作为扩展方法

      static public class SelectListHelper
      {
          static public SelectList Add(this SelectList list, string text, string value = "", ListPosition listPosition = ListPosition.First)
          {
              if (string.IsNullOrEmpty(value))
              {
                  value = text;
              }
              var listItems = list.ToList();
              var lp = (int)listPosition;
              switch (lp)
              {
                  case -1:
                      lp = list.Count();
                      break;
                  case -2:
                      lp = list.Count() / 2;
                      break;
                  case -3:
                      var random = new Random();
                      lp = random.Next(0, list.Count());
                      break;
              }
              listItems.Insert(lp, new SelectListItem { Value = value, Text = text });
              list = new SelectList(listItems, "Value", "Text");
              return list;
          }
      
          public enum ListPosition
          {
              First = 0,
              Last = -1,
              Middle = -2,
              Random = -3
          }
      }
      

      用法(举例):

      var model = new VmRoutePicker
          {
           Routes =
           new SelectList(_dataSource.Routes.Select(r => r.RouteID).Distinct())
           };                                     
        model.Routes = model.Routes.Add("All", "All", SelectListHelper.ListPosition.Random);
      //or
        model.Routes = model.Routes.Add("All");
      

      【讨论】:

        【解决方案10】:

        由于这个选项可能需要多种不同的方式,我得出结论来开发一个对象,以便它可以在不同的场景和未来的项目中使用

        首先将此类添加到您的项目中

        public class SelectListDefaults
        {
            private IList<SelectListItem> getDefaultItems = new List<SelectListItem>();
        
            public SelectListDefaults()
            {
                this.AddDefaultItem("(All)", "-1");
            }
            public SelectListDefaults(string text, string value)
            {
                this.AddDefaultItem(text, value);
            }
            public IList<SelectListItem> GetDefaultItems
            {
                get
                {                
                    return getDefaultItems;
                }
        
            }
            public void AddDefaultItem(string text, string value)
            {        
                getDefaultItems.Add(new SelectListItem() { Text = text, Value = value });                    
            }
        }
        

        现在在 Controller Action 中你可以这样做

            // Now you can do like this
            ViewBag.MainCategories = new SelectListDefaults().GetDefaultItems.Concat(new SelectList(db.MainCategories, "MainCategoryID", "Name", Request["DropDownListMainCategory"] ?? "-1"));
            // Or can change it by such a simple way
            ViewBag.MainCategories = new SelectListDefaults("Any","0").GetDefaultItems.Concat(new SelectList(db.MainCategories, "MainCategoryID", "Name", Request["DropDownListMainCategory"] ?? "0"));
            // And even can add more options
            SelectListDefaults listDefaults = new SelectListDefaults();
            listDefaults.AddDefaultItme("(Top 5)", "-5");
            // If Top 5 selected by user, you may need to do something here with db.MainCategories, or pass in parameter to method 
            ViewBag.MainCategories = listDefaults.GetDefaultItems.Concat(new SelectList(db.MainCategories, "MainCategoryID", "Name", Request["DropDownListMainCategory"] ?? "-1"));
        

        最后在 View 中你会这样编码。

        @Html.DropDownList("DropDownListMainCategory", (IEnumerable<SelectListItem>)ViewBag.MainCategories, new { @class = "form-control", onchange = "this.form.submit();" })
        

        【讨论】:

          【解决方案11】:

          解决方法是使用@tvanfosson 的答案(选择的答案)并使用 JQuery(或 Javascript)将选项的值设置为 0:

          $(document).ready(function () {
                  $('#DropDownListId option:first').val('0');
              });
          

          希望这会有所帮助。

          【讨论】:

            【解决方案12】:

            试试下面的代码:

            MyDAO MyDAO = new MyDAO();    
            List<MyViewModel> _MyDefault = new List<MyViewModel>() {
                            new MyViewModel{
                                Prop1= "All",
                                Prop2 = "Select all"
                            }
                        };
                        ViewBag.MyViewBag= 
                            new SelectList(MyDAO
                            .MyList().Union(
                                _MyDefault
                                ), "Prop1", "Prop2");
            

            【讨论】:

              【解决方案13】:

              如果其他人有更好的选择,我不...

              <% if (Model.VariableName == "" || Model.VariableName== null) { %>
                 <%= html.DropDpwnList("ListName", ((SelectList) ViewData["viewName"], "", 
                      new{stlye=" "})%>
              <% } else{ %>
              <%= html.DropDpwnList("ListName", ((SelectList) ViewData["viewName"], 
                      Model.VariableName, new{stlye=" "})%>
              <% }>
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-10-28
                • 2016-11-01
                • 1970-01-01
                • 2014-05-15
                • 1970-01-01
                • 2020-08-25
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多