DropDownListFor不选择值

sen*_*nfo 76 asp.net-mvc

我正在编辑页面中使用DropDownListFor帮助方法,我没有运气来选择我指定的值.我在Stackoverflow上发现了一个类似的问题.建议的解决方法是"在视图代码中填充SelectList".问题是我已经尝试过这个但它仍然没有用.

<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>
Run Code Online (Sandbox Code Playgroud)

我设置了断点并验证了model.AddressStateAbbr的存在性(和有效性).我只是不确定我错过了什么.

wut*_*cel 175

经过一个小时的研究,我发现导致所选内容未设置的问题DropDownListFor.原因是您使用ViewBag的名称与模型的属性相同.

public  class employee_insignia
{ 
   public int id{get;set;}
   public string name{get;set;}
   public int insignia{get;set;}//This property will store insignia id
}

// If your ViewBag's name same as your property name 
  ViewBag.Insignia = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);
Run Code Online (Sandbox Code Playgroud)

视图

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")
Run Code Online (Sandbox Code Playgroud)

所选选项不会设置为下拉列表,但是当您将ViewBag的名称更改为其他名称时,所选选项将显示正确.

ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);
Run Code Online (Sandbox Code Playgroud)

视图

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是一个正确的答案!对每个人进行Google搜索,请确保您没有将ViewBag属性命名为与model属性相同的名称!我没想到这一点很重要,但它实际上修复了它.我感到震惊. (31认同)
  • 我有同样的问题,即使ViewBag属性与model属性有不同的名称:`@ Html.DropDownListFor(model => model.Title,(SelectList)ViewBag.Salutation,Resources.Labels.Unknown)` (10认同)
  • 有谁知道他们不能相同的原因?这个答案使我的笔记本电脑免于被粉碎:) (7认同)
  • 我不明白.我也有这个问题,我们没有使用ViewBag.问题还在于没有使用ViewBag (6认同)
  • 我认为这是一个ASP.NET MVC错误! (3认同)
  • 对于记录,如果您忘记使用属性签名(没有get; set;,使其成为成员但是公共),则也不会选择下拉项.刚刚失去了4个小时 (2认同)

BnW*_*and 30

尝试:

<%= Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")%>
Run Code Online (Sandbox Code Playgroud)

或者在Razor语法中:

@Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")
Run Code Online (Sandbox Code Playgroud)

基于表达式的助手似乎不尊重SelectList中SelectListItems的Selected属性.


Cha*_*ock 24

如果你正确地使用模型并且使用模型 - 不像所有这些ViewBag怪人 - 并且仍然看到问题,那是因为它与它所具有的选择@Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)不匹配.这可能是两个原因:MyValueMyOptions

  1. MyValue一片空白.您尚未在ViewModel中设置它.让一个人MyOptions有一个Selected=true不会解决这个问题.
  2. 更巧妙的是,类型MyValue中的类型不同MyOptions.所以,如果MyValue(int) 1,但你MyOptions是一个填充字符串列表,{"01", "02", "03", ...}显然不会选择任何东西.

  • 非常感谢你的回答.我也不明白为什么每个人都在使用ViewBag而不是创建一个合适的视图模型.这个答案盯着我的脸,我很感激你连接点. (2认同)
  • #2这是我的问题.我有一个模型属性,它是一个委托类型,带有一个自定义模型绑定器,用于接受Method的名称,并从与委托签名匹配的预定义方法调用列表中实际绑定该方法.有没有人发现一个是解决#2并使其正确选择没有一些hacky客户端脚本? (2认同)

fia*_*iat 16

虽然没有解决这个问题 - 如果他们遵循我的思路,它可能有助于未来的googlers:

我想要一个多重选择,这个属性黑客DropDownListFor不是自动选择

Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })
Run Code Online (Sandbox Code Playgroud)

相反,我应该使用ListBoxFor,这使一切正常

Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)
Run Code Online (Sandbox Code Playgroud)

  • 我沿着你的思路前进.世界:如果您使用DropDownListFor和多个,则意味着使用ListBoxFor. (6认同)