DropDownListFor不选择值


83

我在编辑页面中使用了DropDownListFor helper方法,但没有运气让它选择我指定的值。我在Stackoverflow上注意到了类似的问题。建议的解决方法是“在视图代码中填充您的SelectList”。问题是我已经尝试过了,但仍然无法正常工作。

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

我设置了一个断点,并验证了model.AddressStateAbbr的存在(和有效性)。我只是不确定我缺少什么。

Answers:


182

经过一个小时的研究,我发现了导致所选项目无法设置为的问题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);

视图

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")

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

ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

视图

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")

34
这实际上是一个正确的答案!!!对于所有使用Google搜索的人,请确保不要将ViewBag属性的名称与model属性的名称相同!我根本没想到这很重要,但实际上可以解决它。我感到震惊。
Tesserex 2012年

10
即使ViewBag属性的名称与model属性的名称不同,我也有同样的问题:@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Paul Taylor

8
有谁知道他们为什么不能一样的原因?这个答案使我的笔记本电脑免于被砸:)
Jeandre Pentz 2013年

7
我不明白 我也遇到了这个问题,我们没有使用ViewBag。同样的问题不是使用ViewBag
George Mauer

3
我认为这是一个ASP.NET MVC错误!
内斯托尔·桑切斯A.

30

尝试:

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

或使用Razor语法:

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

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


谢谢!我需要一种快速的方法来从数据库存储库中获取选定的值!我需要Model.AddressStateAbbr。甜。再次感谢
Tom Stickel 2011年

30

如果您正确执行并使用模型(不同于所有这些ViewBag怪胎),但仍然看到问题,那是因为@Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)无法MyValue与其在其中的选择匹配MyOptions。造成这种情况的两个潜在原因是:

  1. MyValue一片空白。您尚未在ViewModel中进行设置。制作一个MyOptionsSelected=true不会解决这个问题。
  2. 更巧妙的是,类型MyValue比在不同类型MyOptions。因此,如果MyValueis是(int) 1,但是您MyOptions是填充字符串的列表{"01", "02", "03", ...},则显然不会选择任何内容。

4
非常感谢您的回答。我也不明白为什么每个人都使用ViewBag而不是创建适当的视图模型。这个答案使我瞪大了脸,我感谢您将这些点连接起来。
歧义

2
#2这是我的问题。我有一个模型属性,它是一个委托类型,带有一个自定义模型绑定器,以采用Method的名称并实际上从与委托签名匹配的预定义方法调用列表中绑定该方法。有没有人发现a在#2周围可以解决问题,并使其正确选择而没有一些骇人的客户端脚本?
mikeschuld

1
感谢另一个使用View Models的时髦人士:D
Vladimir Bozic

1
同样,对于具有SelectList且value属性与选项标签之间的显示文本不同的任何人,例如:<option value="2">some text</option>。它看起来实际上是在尝试将视图模型属性与显示文本进行匹配,而不是选择所选选项的value属性进行匹配。这让我走了一段时间。
杰森·汉森

17

虽然未解决此问题-如果将来的Google员工遵循我的想法,可能会有所帮助:

我想要多选,并且DropDownListFor上的此属性hack不是自动选择

Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })

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

Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)

6
我遵循了你的想法。世界:如果您使用DropDownListFor或多个,则意味着要使用ListBoxFor。
斯科特·斯塔福德

这很烦人。在我的代码的另一个地方,所有东西都一样,DropDownListFor可以正常工作。我花了四个或五个小时来尝试使它工作。我的最后一个沟渠就是这个,而且有效。
Bryan Hobbs

1

我也有类似的问题,我可以通过以下方法解决,设置

控制器上的model.States属性为您需要选择的内容

model.States =“加利福尼亚”

然后您将获得“加利福尼亚”作为默认值。



0

要检查是否还不是您自己的代码,另一件事是确保没有javascript函数更改页面加载时的值。数小时将我的头撞在墙上,阅读所有这些解决方案后,我发现这就是我正在发生的事情。


0

我最近遇到了这个问题。它使我发疯了大约一个小时。就我而言,我没有使用ViewBag与模型属性同名的变量。

跟踪源代码控制更改后,问题出在我的操作中,有一个参数与模型属性同名

public ActionResult SomeAction(string someName)
{
    var model = new SomeModel();
    model.SomeNames = GetSomeList();
    //Notice how the model property name matches the action name
    model.someName = someName; 
}

在视图中:

@Html.DropDownListFor(model => model.someName, Model.SomeNames)

我只是将操作的参数更改为其他名称,然后它再次开始工作:

public ActionResult SomeAction(string someOtherName)
{
    //....
}

我想也可以更改模型的属性名称,但是对我来说,参数名称是没有意义的,所以...

希望这个答案可以省去别人的麻烦。


0

这个问题至少对我来说是与问题有关的IEnumerable<T>

基本上发生的是,视图和模型对于相同的属性没有相同的引用。

如果你这样做

IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}

然后使用

@Html.DropDownListFor(model => model.Id, Model.CoolNames)

View失去对CoolNames属性的跟踪,一个简单的修复方法是.ToList()在投影(.Select());)之后添加。


0

我有同样的问题。在下面的示例中,变量ViewData [“ DATA_ACREDITO_MODELO_INTEGRADO”]具有一个SelectListItem列表,该列表具有默认的选定值,但该属性无法直观地反映出来。

// data 
        var p_estadoAcreditacion = "NO";
        var estadoAcreditacion = new List<SelectListItem>();
        estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)"    , Value = " "    });
        estadoAcreditacion.Add(new SelectListItem { Text = "SI"              , Value = "SI"   });
        estadoAcreditacion.Add(new SelectListItem { Text = "NO"              , Value = "NO"   });

        if (!string.IsNullOrEmpty(p_estadoAcreditacion))
        {
            estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
        }
         ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;

我通过使DropdownList的第一个参数不同于id属性来解决它。

// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"

...


0

我知道这是一个老问题,但我在2020年遇到过同样的问题。

事实证明,问题出在模型属性名为“ Title”的情况下,我将其重命名为“ GivenTitle”,现在可以正常使用了。

Html.DropDownListFor(m => m.Title, Model.Titles, "Please Select", new { @class = "form-control" })

Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.