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;
}

次に、コントローラーでメソッドを呼び出し、4番目のパラメーターを顧客タイプの事前に選択された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());

より良い解決策は、値列に列挙値を使用し、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 に答える