使用DropDownListFor时,不显示所选项目

时间:2011-12-29 15:05:46

标签: asp.net-mvc asp.net-mvc-3

我使用以下内容生成下拉列表:

@for (var index = 0; index < Model.AdminSummaries.Count(); index++) 
            { 
            <div class="rep_tr0"> 
                <div class="rep_td0"> 
                    @Html.DropDownListFor(x => Model.AdminSummaries[index].Status, 
                       AdminStatusReference.GetAdminStatusOptions(),
                       new { id = string.Format("Status_{0}",index ) })
                 </div> 
            </div>
            }

以下是它生成的HTML:

<select id="Status_1" name="AdminSummaries[1].Status"><option value="1">Released</option>
<option value="2">Review</option>
<option value="3">New</option>
</select>

这是提供状态选项的类。

public static class AdminStatusReference
{

    public static IEnumerable<SelectListItem> GetAdminStatusOptions()
    {
        return new[]
            {
                new SelectListItem { Value = "1", Text = "Released"  },
                new SelectListItem { Value = "2", Text = "Review" },
                new SelectListItem { Value = "3", Text = "New" }
            };
    }

}

一切正常,除非它没有正确选择项目。 “选定”没有选项可以匹配AdminSummaries中的数据。

如何选择正确的选择列表项?

只是澄清一下。我的问题是,如果状态的数据记录值为3,那么当我查看屏幕时,我会看到一个显示“Release”字样的选择列表。

我需要的是选择列表显示与数据值对应的文本。

3 个答案:

答案 0 :(得分:1)

SelectListItem.Selected属性设置为true

public static class AdminStatusReference 
{ 

    public static IEnumerable<SelectListItem> GetAdminStatusOptions() 
    { 
        return new[] 
            { 
                new SelectListItem { Value = "1", Text = "Released", Selected = true  }, 
                new SelectListItem { Value = "2", Text = "Review" }, 
                new SelectListItem { Value = "3", Text = "New" } 
            }; 
    } 

} 

答案 1 :(得分:1)

这是更准确的答案

public static class AdminStatusReference 
{ 
    public static IEnumerable<SelectListItem> GetAdminStatusOptionsFor(AdminSummaries arg) 
    { 
        var options = new[] 
            { 
                new SelectListItem { Value = "1", Text = "Released" }, 
                new SelectListItem { Value = "2", Text = "Review" }, 
                new SelectListItem { Value = "3", Text = "New" } 
            }; 
        options.First(o=> o.Value == arg).Selected = true;
        return options; 
    } 
} 

答案 2 :(得分:1)

从源代码中发现DropDownListFor方法(实际上ViewDataEvaluator.Eval方法)不支持包含索引器的表达式。因为您的表达式:AdminSummaries[index].Status包含一个索引器,这就是框架不使用模型类中所选值的原因。  唯一的解决方案是在设置SelectListItem集合时指定所选项目,您可以通过将当前选定的值传递到GetAdminStatusOptions方法来执行此操作:

查看:

@Html.DropDownListFor(x => Model.AdminSummaries[index].Status,
    AdminStatusReference.GetAdminStatusOptions(Model.AdminSummaries[index].Status),
    new { id = string.Format("Status_{0}",index ) })  

示例GetAdminStatusOptions实现:

public static IEnumerable<SelectListItem> GetAdminStatusOptions(string selected = null)
{
    var options = new[]
                      {
                          new SelectListItem {Value = "1", Text = "Released"},
                          new SelectListItem {Value = "2", Text = "Review"},
                          new SelectListItem {Value = "3", Text = "New"}
                      };
    foreach (var option in options)
    {
        option.Selected = option.Value == selected;
    }
    return options;
}