c# - MVC 2 DropDownList 在 List 的情况下不选择值

标签 c# asp.net-mvc model-view-controller drop-down-menu

我正在使用 ASP.Net MVC 2,但无法正确绑定(bind) DropDownList。

我正在使用强类型 ViewModel 和 HTML.DropDownListFor 语句在我的 View 中创建下拉列表。该语句在“正常”场景中运行良好,我只是将 DropDown 绑定(bind)到我的 ViewModel 中的一个简单字段。 当我的 ViewModel 包含多个对象的列表(数组)时,我在使用这种情况时遇到问题,我希望每个对象中的一个字段绑定(bind)到(单独的)DropDown。在这种情况下,DropDown 不会获得正确的初始值。

例如我们有一个人可以有多个地址的情况。每个地址由街道、城市和州组成。我希望状态显示为 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; }
}

现在在我的 View 中我想使用类似的东西:

<% 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 中选择一个值并提交表单,正确的值将放回我的模型中。

我还尝试将 Address 部分放入 UserControl 中,然后多次呈现。如果我使用 Html.RenderPartial 呈现 UserControl,则在 DropDOwn 中设置了正确的值,但在回发时我的模型未正确填充。如果我使用 EditorFor 呈现 UserControl,我会遇到与上面代码相​​同的问题:DropDown 没有获得正确的初始值,但在回发时我确实获得了模型中设置的选定值。

我尝试的另一件事是使地址不是列表,而是在我的 View 模型(属性:Address1、Address2、Address3)中硬编码多个地址,然后使用: <%= Html.DropDownListFor(person => person.Address1.State, Model.AvailableStates) %> 在这种情况下,DropDown 确实获得了正确的值。显然,由于缺乏灵 active ,我不想使用此解决方法。

我做错了什么?我是 MVC 的新手,所以也许我的整个方法都是错误的?

最佳答案

这是 DropDownListFor 助手的一个限制,它不能从复杂的 lambda 表达式中提取值,例如您正在使用的表达式(包含数组索引访问的 lambda 表达式)。一种可能的解决方法如下:

<%= Html.DropDownListFor(
    person => person.Addresses[i].State, 
    new SelectList(
        Model.AvailableStates, 
        "Text", 
        "Value", 
        Model.Addresses[i].State
    )
) %>

这有点难看,因为我们现在在 SelectList 构造函数中传递相同的值,但这次 DropDownListFor 助手将能够正确设置相应的选项。

关于c# - MVC 2 DropDownList 在 List 的情况下不选择值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10506828/

相关文章:

C#获取XML属性

c# - 如何使用 Application Insights 覆盖或忽略 cloud_RoleInstance

c# - 如何将 DTO 从 EF 映射到模型

javascript - 如何使用 MVC 并在我的 Node 应用程序中包含文件

javascript - Backbone.js model.save() 发送多个 PUT 请求

javascript - backbone.js 根据另一个 View 中的事件更新一个 View ?

c# - 将 Include() 调用替换为 Select()

c# - 如何更改正则表达式?

c# - 将新的 XElement 添加到现有的 XElement(如果它不存在)

asp.net - 编辑和重新显示内容时强制刷新缓存