ASP.NET MVC Html.DropDownList SelectedValue

blu*_*blu 102 asp.net-mvc

我试过这是RC1,然后升级到RC2,但没有解决问题.

// in my controller
ViewData["UserId"] = new SelectList(
    users, 
    "UserId", 
    "DisplayName", 
    selectedUserId.Value); // this has a value
Run Code Online (Sandbox Code Playgroud)

result:在对象上设置SelectedValue属性

// in my view
<%=Html.DropDownList("UserId", (SelectList)ViewData["UserId"])%>
Run Code Online (Sandbox Code Playgroud)

结果:所有预期选项都呈现给客户端,但未设置所选属性.SelectedValue中的项目存在于列表中,但列表中的第一项始终默认为选中.

我该怎么做?

更新 感谢John Feminella的回复,我发现了问题所在."UserId"是我的视图强类型化的模型中的属性.当Html.DropDownList("UserId"更改为除"UserId"之外的任何其他名称)时,将正确呈现所选值.

这导致值不受模型约束.

San*_*tos 69

这就是我解决这个问题的方法:

我有以下内容:

控制器:

ViewData["DealerTypes"] = Helper.SetSelectedValue(listOfValues, selectedValue) ;
Run Code Online (Sandbox Code Playgroud)

视图

<%=Html.DropDownList("DealerTypes", ViewData["DealerTypes"] as SelectList)%>
Run Code Online (Sandbox Code Playgroud)

由以下内容更改:

视图

<%=Html.DropDownList("DealerTypesDD", ViewData["DealerTypes"] as SelectList)%>
Run Code Online (Sandbox Code Playgroud)

似乎DropDown必须不具有ViewData名称相同的名称:S很奇怪,但它有效.

  • +"DropDown必须具有相同名称的+1具有ViewData名称"非常感谢 (19认同)
  • 你最好将'DS'添加到viewdata名称,这样就不会破坏模型绑定...... (3认同)

Joh*_*lla 50

试试这个:

public class Person {
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

var list = new[] {   
    new Person { Id = 1, Name = "Name1" }, 
    new Person { Id = 2, Name = "Name2" }, 
    new Person { Id = 3, Name = "Name3" } 
};

var selectList = new SelectList(list, "Id", "Name", 2);
ViewData["People"] = selectList;

Html.DropDownList("PeopleClass", (SelectList)ViewData["People"])
Run Code Online (Sandbox Code Playgroud)

使用MVC RC2,我得到:

<select id="PeopleClass" name="PeopleClass">
    <option value="1">Name1</option>
    <option selected="selected" value="2">Name2</option>
    <option value="3">Name3</option>
</select>
Run Code Online (Sandbox Code Playgroud)


Rui*_*Rui 5

您仍然可以将DropDown命名为"UserId",并且仍然可以为您正确运行模型绑定.

要使其工作的唯一要求是包含SelectList的ViewData键与要绑定的Model属性的名称不同.在您的具体情况下,这将是:

// in my controller
ViewData["Users"] = new SelectList(
    users, 
    "UserId", 
    "DisplayName", 
    selectedUserId.Value); // this has a value

// in my view
<%=Html.DropDownList("UserId", (SelectList)ViewData["Users"])%>
Run Code Online (Sandbox Code Playgroud)

这将生成一个名为UserId的select元素,它与模型中的UserId属性具有相同的名称,因此模型绑定器将使用在Html.DropDownList帮助程序生成的html的select元素中选择的值来设置它.

我不确定为什么当您使用等于属性名称的键将选择列表放在ViewData中时,特定的Html.DropDownList构造函数不会选择SelectList中指定的值.我怀疑它与如何在其他场景中使用DropDownList助手有关,其中约定是在ViewData中有一个与模型中属性同名的SelectList.这将正常工作:

// in my controller
ViewData["UserId"] = new SelectList(
    users, 
    "UserId", 
    "DisplayName", 
    selectedUserId.Value); // this has a value

// in my view
<%=Html.DropDownList("UserId")%>
Run Code Online (Sandbox Code Playgroud)