在MVC3 Html.DropDownlListFor()中预选绑定到ENUM列表的项目

时间:2012-08-14 10:40:52

标签: asp.net-mvc selectlist html.dropdownlistfor

我使用以下帮助方法将MVC(3)selectList绑定到枚举

public static List<SelectListItem> GetSelectList<T>()
{
    Type enumType = typeof(T);
    if (!enumType.IsEnum)
        throw new ArgumentException("The specified type is not enum");

    List<SelectListItem> enumList = new List<SelectListItem>();

    var values = Enum.GetValues(enumType);

    foreach (var value in values)
    {
        SelectListItem newItem = new SelectListItem();

        newItem.Value = Convert.ToInt32(value).ToString();
        newItem.Text = Regex.Replace(Enum.GetName(enumType, value), "([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))", "$1 ");

        enumList.Add(newItem);
    }
    return enumList;
}

然后在我的控制器中调用该方法,并将第四个参数作为客户类型的预选id传递给selectList构造函数。

 _view.CustomerTypeSelectList = new SelectList(EnumHelper.GetSelectList<CustomerTypeEnum>(), "Value", "Text", _customer.TypeID);

然后在视图中我绑定了selectList

<%=Html.DropDownListFor(x => x.CustomerTypeId, Model.CustomerTypeSelectList )%>

但是我无法让selectList预先填充。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

使用字符串 - 字符串值对填充enumList,因此在指定所选元素时,您也应该使用字符串(使用Convert.ToInt32和ToString)。 在GetSelectList帮助器中,您应该返回SelectList,如下所示:

_view.CustomerTypeSelectList = new SelectList(EnumHelper.GetSelectList<CustomerTypeEnum>(), "Value", "Text", Convert.ToInt32(_customer.TypeID).ToString());

更好的解决方案是使用值列的枚举值并从GetSelectList返回SelectList对象:

    public static SelectList GetSelectList<T>()
    {
        Type enumType = typeof(T);
            if (!enumType.IsEnum)
                throw new ArgumentException("The specified type is not enum");

        var values = Enum.GetValues(enumType);
        var enumList = values.Select(e=>new { Value = e , Text = Regex.Replace(Enum.GetName(enumType, e), "([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))", "$1 ") })
        var selectList = new SelectList(values, "Value", "Text", enumObj);
        return selectList;
}