我正在使用 ASP.Net MVC 2 并且无法正确绑定 DropDownList。
我正在使用强类型 ViewModel 和 HTML.DropDownListFor 语句在我的视图中创建下拉列表。该语句在“正常”场景中运行良好,我只是将 DropDown 绑定到 ViewModel 中的一个简单字段。当我的 ViewModel 包含多个对象的列表(数组)时,我在使用这种场景时遇到问题,我希望每个对象中的一个字段绑定到(单独的)下拉菜单。在这种情况下,DropDown 没有得到正确的初始值。
例如,我们有一个可以有多个地址的人的情况。每个地址由街道、城市和州组成。我希望将状态显示为下拉菜单。我的模型是:
public class PersonModel : CommonViewModel
{
public IList<SelectListItem> AvailableStates { get; set; }
public string Name { get; set; }
public IList<AddressModel> Addresses { get; set; }
public PersonModel()
{
AvailableStates = GenerateStates();
}
private IList<SelectListItem> GenerateStates()
{
List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem() { Text = "WA", Value = "WA" });
items.Add(new SelectListItem() { Text = "NY", Value = "NY" });
items.Add(new SelectListItem() { Text = "IH", Value = "IH" });
items.Add(new SelectListItem() { Text = "FL", Value = "FL" });
items.Add(new SelectListItem() { Text = "CA", Value = "CA" });
return items;
}
}
public class AddressModel
{
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
}
现在在我的视图中,我想使用类似的东西:
<% using (Html.BeginForm("SubmitPersonDetails", "Home", new { actionMode = "Person"}, FormMethod.Post, new { id = "SubmitPersonForm" }))
{%>
<div class="formrow longinput">
<%= Html.LabelFor(person => person.Name)%>
<%= Html.TextBoxFor(person => person.Name)%>
</div>
<h4>Addresses</h4>
<% for (int i = 0; i < Model.Addresses.Count; i++) { %>
<div class="formrow">
<%= Html.TextBoxFor(person => person.Addresses[i].Street)%>
<%= Html.TextBoxFor(person => person.Addresses[i].City)%>
<%--<%= Html.TextBoxFor(person => person.Addresses[i].State)%>--%>
<%= Html.DropDownListFor(person => person.Addresses[i].State, Model.AvailableStates) %>
</div>
<% } %>
<input class="button primary" type="submit" value="Submit" name="Submit" />
<% } %>
对于文本框,这很好用(如果我只使用文本框作为状态,请参阅注释掉的位)。DropDown 的生成正确,但未设置为正确的值。如果我在 DropDowns 中选择一个值并提交表单,则正确的值将放回我的模型中。
我还尝试将地址部分放在 UserControl 中,然后渲染几次。如果我使用 Html.RenderPartial 呈现 UserControl,则在 DropDOwn 中设置了正确的值,但在回发时,我的模型没有正确填充。如果我使用 EditorFor 渲染 UserControl,我会遇到与上面的代码相同的问题:DropDown 没有获得正确的初始值,但在回发时,我确实获得了在我的模型中设置的选定值。
我尝试的另一件事是使地址不是列表,而是在我的视图模型中硬编码几个地址(属性:Address1、Address2、Address3),然后使用:<%= Html.DropDownListFor(person => person.Address1.State, Model .AvailableStates) %> 在这种情况下,DropDown 确实获得了正确的值。显然,由于缺乏灵活性,我不想使用这种解决方法。
我究竟做错了什么?我是 MVC 的新手,所以也许我的整个方法都是错误的?