MVC DropDownListFor - SelectedItem不适用于嵌套值

时间:2015-03-04 11:35:53

标签: c# asp.net-mvc asp.net-mvc-4 enums html.dropdownlistfor

在我的C#,MVC4 .NET WebApplication中,我有一个自定义助手,它有以下方法调用:

@Custom.DropDownListFor(m => m.CategorySetups[categoryId].Gender, CategoryHelper.Genders, new { @class = "form-control" })

内部类似于:

@Html.DropDownListFor(expression, new SelectList(items, "Value", "Text"))

因为我在这里覆盖了SelectListItem。

此调用未选择存储在

中的渲染视图中的值
m.CategorySetups[categoryId].Gender

如果我以这种方式调用方法(不在同一视图中):

@Custom.DropDownListFor(m => m.Gender, CategoryHelper.Genders, new { @class = "form-control" })

呈现的HTML具有标记为

的正确值
<option value="Under15" selected>Under15</option>

所以我的猜测是,这与选择的属性的嵌套有关,但是我没有看到它。

从调试中我可以看到,

m.CategorySetups[categoryId].Gender

在应该选择时会设置正确的值。

注意:不确定这是否会导致问题(因为它的第二种工作方式)但绑定值类型为Enum。

评论时更新:

实施如下:

 public static readonly List<SelectListItem<ClassificationType>> ClassificationTypes = new List<SelectListItem<ClassificationType>>
        {
            new SelectListItem<ClassificationType> {Text = @"please select...", Value = ClassificationType.NotSet},
            new SelectListItem<ClassificationType> {Text = EnumParser.GetString(ClassificationType.Under13), Value = ClassificationType.Under13},
            new SelectListItem<ClassificationType> {Text = EnumParser.GetString(ClassificationType.Under15), Value = ClassificationType.Under15},
            new SelectListItem<ClassificationType> {Text = EnumParser.GetString(ClassificationType.Under18), Value = ClassificationType.Under18},
            new SelectListItem<ClassificationType> {Text = EnumParser.GetString(ClassificationType.Over30), Value = ClassificationType.Over30},
            new SelectListItem<ClassificationType> {Text = EnumParser.GetString(ClassificationType.Open), Value = ClassificationType.Open}
        };

1 个答案:

答案 0 :(得分:1)

SelectList构造函数的overload带有参数object selectedValue,您需要指定所选的值,正常DropDownListFor()我们这样做:

@Html.DropDownListFor(m=>m.Gender,
                     new SelectList(Model.Genders,"Id","Value",Model.Gender),
                     new { @class = "form-control" })

更新:

在您的情况下,您可以这样做:

@Custom.DropDownListFor(m => m.CategorySetups[categoryId].Gender, 
                        new SelectList(CategoryHelper.Genders,"Value","Text",Model.CategorySetups[categoryId].Gender), 
                        new { @class = "form-control" })

更重要的是,当您通过Enum填充项目时,您可以使用我在this answer

中发布的扩展方法