【问题标题】:Html.DropdownListFor selected value not being setHtml.DropdownListFor 未设置所选值
【发布时间】:2013-10-28 21:11:51
【问题描述】:

如何设置 Html.DropDownListFor 的选定值?我在网上看了一下,发现可以通过使用第四个参数来实现,如下所示:

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

我的选择列表然后显示如下:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

但由于某种原因,英国仍处于选中状态,但我希望选择“请选择一个国家/地区”。

有谁知道我是怎么做到的?

编辑

我已经更新了我的代码,因为功能略有变化,但似乎仍然遇到了这个问题。这是我的看法:

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1 是我要选择的 option 的 ID,我也尝试过使用 option 的文本,但这也不起作用。

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    您的代码存在一些概念问题:

    第一

    @Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")
    

    使用 DropDownListFor 时,第一个参数是提交表单后存储所选值的属性。因此,在您的情况下,您应该将 SelectedOrderId 作为模型的一部分或类似的东西,以便以这种方式使用它:

    @Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")
    

    第二

    除了使用 ViewBag,这并没有错,但有更好的方法(将这些信息放在 ViewModel 中),当您的 ViewBag 属性出现时,会有一个“小错误”(或未察觉的行为) ,您持有 SelectList 的位置与放置所选值的属性的名称相同。为避免这种情况,只需在命名包含项目列表的属性时使用另一个名称。

    如果我是你,我会使用一些代码来避免这个问题并编写更好的 MVC 代码:

    视图模型:

    public class MyViewModel{
       public int SelectedOrderId {get; set;}
       public SelectList OrderTemplates {get; set;}
    
       // Other properties you need in your view
    }
    

    控制器:

    public ActionResult MyAction(){
       var model = new MyViewModel();
       model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
       //Other initialization code
    
       return View(model);
    }
    

    在你看来:

    @Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")
    

    【讨论】:

    • 拯救了我的一天:“...当您持有 SelectList 的 ViewBag 属性与您放置所选值的属性名称相同时,会出现一个小错误。为避免这种情况,只需在命名保存项目列表的属性时使用另一个名称。”谢谢!
    • 这个“小虫子”简直是疯了!就因为这个,浪费了我生命中的两个小时。如此明显的东西怎么可能还存在而不被修补?
    • 弗林,您的评论实际上应该是一个答案。我尝试了疯狂的实现来让我的下拉列表工作,这是简单的解决方案
    • 有一个小错误?它根本不是一个错误。模型绑定通过绑定到属性的值来工作,当您绑定到OrderTemplates 时,您尝试绑定到类型为IEnumerabe&lt;SelectListItem&gt;ViewBag 属性。但是&lt;select&gt; 元素不能绑定到复杂对象的集合(只能是值类型)
    • 天哪,如果不是这个答案,我会浪费一整天的时间。说真的,LITTLE BUG 是我们应该放弃 viewbag 的原因
    【解决方案2】:

    对我来说没有这样的工作方式:

    控制器:

    int selectedId = 1;
    
    ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);
    

    查看:

    @Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)
    

    JQuery:

    $("document").ready(function () {
        $('#ItemId').val('@Model.ItemId');
    });
    

    【讨论】:

    • 您的控制器的括号数量错误:它有一个左括号和两个右括号。
    【解决方案3】:

    当你传递这样一个对象时:

    new SelectList(Model, "Code", "Name", 0)
    

    您说的是:源 (Model) 和键 ("Code") 文本 ("Name") 和选定的值 0。您的 Code 属性的源中可能没有 0 值,因此 HTML Helper 将选择第一个元素以将实际 selectedValue 传递给此控件。

    【讨论】:

      【解决方案4】:

      确保在分配之前修剪了选定的值。

      //型号

      public class SelectType
      {
          public string Text { get; set; }
          public string Value { get; set; }
      }
      

      //控制器

      var types = new List<SelectType>();
      types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
      types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
      types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
      ViewBag.PartialTypes = types;
      

      //查看

      @Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })
      

      【讨论】:

        【解决方案5】:

        如果您知道视图中的内容,您也可以从 Controller 中设置默认值,而不是将其设置到 view/cshtml 文件中。 无需从 HTML 端设置默认值。

        在控制器文件中。

        commission.TypeofCommission = 1;
        return View(commission);
        

        在 .cshtml 文件中。

        @Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")
        

        【讨论】:

          【解决方案6】:

          你应该忘记上课

          选择列表

          在您的控制器中使用它:

          var customerTypes = new[] 
          { 
              new SelectListItem(){Value = "all", Text= "All"},
              new SelectListItem(){Value = "business", Text= "Business"},
              new SelectListItem(){Value = "private", Text= "Private"},
          };
          

          选择值:

          var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
          if (selectedCustomerType != null)
              selectedCustomerType.Selected = true;
          

          将列表添加到 ViewData:

          ViewBag.CustomerTypes = customerTypes;
          

          在您的视图中使用它:

          @Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)
          

          -

          更多信息请访问:http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc

          【讨论】:

            【解决方案7】:

            添加控制器部分

              ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);
            

            添加 Html 部分

               @Html.DropDownList("Orders", null)
            

            一个简单的方法

            【讨论】:

            • 一个简单的替代事务处理
            【解决方案8】:

            对我来说一般解决方案:)

            @{
                 var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
                 if (selectedCity != null)
                 { 
                     @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
                 }
                 else
                 { 
                     @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
                 }
            }
            

            【讨论】:

              【解决方案9】:

              Linq to Dropdown 与空项目,选定项目(工作 100%)
              (强类型化,错误几率最小)任何模型更改都将反映在绑定中

              控制器

              public ActionResult ManageSurveyGroup()
                  {
                      tbl_Survey sur = new tbl_Survey();
                      sur.Survey_Est = "3";
              
                      return View(sur);
                  }
              

              查看

                      @{
              
              
                  //Step One : Getting all the list
                  var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();
              
                  //Step Two  : Adding a no Value item **
                  CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });
              
                  //Step Three : Setting selected Value if value is present
                  var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });
              
                      }
                      @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
                      @Html.ValidationMessageFor(model => model.Survey_Est)
              

              这种绑定数据的方法也可以

              var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });
              

              【讨论】:

              • var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false } );
              【解决方案10】:

              我知道这并不是问题的真正答案,但是当我一直绊倒这篇文章时,我一直在寻找一种方法来从视图中的动态列表中初始化 DropDownList。

              我的错误是我试图从字典中创建一个 SelectList,如下所示:

              //wrong!
              @Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...
              

              然后我去挖掘官方msdn doc,发现DropDownListFor不一定需要SelectList,而是IEnumerable&lt;SelectListItem&gt;

              //right
              @Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })
              

              在我的情况下,我可能也可以省略 Model.Locality 作为选定项目,因为它 a) 唯一的项目 b) 它已经在 SelectListItem.Selected 属性中说明了它。

              如果您想知道,数据源是一个 AJAX 页面,它使用 SelectWoo/Select2 控件动态加载。

              【讨论】:

                【解决方案11】:
                public byte UserType
                public string SelectUserType
                

                你需要得到一个并设置不同的。所选值不能与您要设置的项目相同。

                @Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))
                

                我在列表中使用 Enum 字典,这就是为什么会有“键”、“值”对。

                【讨论】:

                  【解决方案12】:

                  我遇到了类似的问题,我使用相同的 ViewBag 和 Element 名称。 (打字错误)

                  【讨论】:

                    【解决方案13】:

                    这是 CSS 问题。我不知道为什么 Bootstrap 4 中的 @Html.DropDownListFor 不起作用。当然这是类设计问题。无论如何,如果您的下拉输入框有 CSS Padding: #px, # px;元素然后禁用它。希望这会奏效。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-08-05
                      • 1970-01-01
                      • 2012-06-20
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多