DropDownListFor不选择值

时间:2010-02-17 03:06:57

标签: asp.net-mvc

我在编辑页面中使用DropDownListFor帮助方法,我没有运气来选择我指定的值。我注意到Stackoverflow上有一个similar question。建议的解决方法是“在视图代码中填充SelectList”。问题是我已经尝试过了,但它仍然没有用。

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

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

11 个答案:

答案 0 :(得分:172)

经过一个小时的研究,我发现问题导致所选内容未设置为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")

答案 1 :(得分: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属性。

答案 2 :(得分:22)

如果您正确地使用模型并且使用模型 - 与所有这些ViewBag怪异不同 - 并且仍然看到问题,那是因为@Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)无法将MyValue与其拥有的选项匹配在MyOptions。这可能是两个原因:

  1. MyValue为空。您尚未在ViewModel中设置它。让其中一个MyOptions拥有Selected=true将无法解决此问题。
  2. 更为微妙的是,MyValue类型MyOptions中的类型不同。因此,如果MyValue(int) 1,但您的MyOptions是填充字符串列表{"01", "02", "03", ...},则显然不会选择任何内容。

答案 3 :(得分:16)

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

我想要一个多项选择,这个属性攻击 DropDownListFor 没有自动选择

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

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

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

答案 4 :(得分:1)

我也有类似的问题,我按如下方式解决,

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

model.States = “加利福尼亚”

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

答案 5 :(得分:0)

这个问题很常见。将viewbag属性名称更改为其他页面上使用的模型变量名称。

答案 6 :(得分:0)

另一件事是检查它是不是你自己的代码,是为了确保没有javascript函数改变页面加载的值。经过几个小时的撞击墙壁阅读所有这些解决方案后,我发现这就是我发生的事情。

答案 7 :(得分:0)

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

在跟踪源控件的更改后,问题出在我的 action 中,有一个与模型属性同名的参数

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)
{
    //....
}

我想也可以更改模型的属性名称,但是在我的情况下,参数名称没有意义,所以...

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

答案 8 :(得分:0)

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

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

如果您这样做

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

然后使用

将其绑定
@Html.DropDownListFor(model => model.Id, Model.CoolNames)

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

答案 9 :(得分: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"

...

答案 10 :(得分: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" })