0

我正在使用以下帮助方法将 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 预填充。

有任何想法吗?

4

1 回答 1

0

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

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

更好的解决方案是对 value 列使用枚举值并从 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;
}
于 2012-08-14T11:06:40.617 回答