1. ホーム
  2. c#

[解決済み] MVC3 Razor DropDownListFor Enums

2023-05-23 08:26:09

質問

私のプロジェクトを MVC3 に更新しようとしているのですが、どうしても見つからないものがあります。

私はENUMSの単純なデータ型を持っています。

public enum States()
{
  AL,AK,AZ,...WY
}

このデータ型を含むモデルのビューで、DropDown/SelectListとして使用したいものです。

public class FormModel()
{
    public States State {get; set;}
}

とても簡単なことです。この部分クラスに対して自動生成ビューを使おうとすると、この型を無視するのです。

私は、AJAX - JSON POSTメソッド経由で送信と処理をヒットしたときに、選択されたアイテムとして列挙型の値を設定する単純な選択リストが必要です。

そして、ビューよりも(?)

    <div class="editor-field">
        @Html.DropDownListFor(model => model.State, model => model.States)
    </div>

アドバイスをありがとうございました。

どのように解決するのですか?

私はちょうど私自身のプロジェクトのために1つを作りました。以下のコードは私のヘルパークラスの一部であり、私は私が必要なすべてのメソッドを得たことを願っています。それが動作しない場合は、コメントを書いてください、私は再びチェックします。

public static class SelectExtensions
{

    public static string GetInputName<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
    {
        if (expression.Body.NodeType == ExpressionType.Call)
        {
            MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body;
            string name = GetInputName(methodCallExpression);
            return name.Substring(expression.Parameters[0].Name.Length + 1);

        }
        return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
    }

    private static string GetInputName(MethodCallExpression expression)
    {
        // p => p.Foo.Bar().Baz.ToString() => p.Foo OR throw...
        MethodCallExpression methodCallExpression = expression.Object as MethodCallExpression;
        if (methodCallExpression != null)
        {
            return GetInputName(methodCallExpression);
        }
        return expression.Object.ToString();
    }

    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
    {
        string inputName = GetInputName(expression);
        var value = htmlHelper.ViewData.Model == null
            ? default(TProperty)
            : expression.Compile()(htmlHelper.ViewData.Model);

        return htmlHelper.DropDownList(inputName, ToSelectList(typeof(TProperty), value.ToString()));
    }

    public static SelectList ToSelectList(Type enumType, string selectedItem)
    {
        List<SelectListItem> items = new List<SelectListItem>();
        foreach (var item in Enum.GetValues(enumType))
        {
            FieldInfo fi = enumType.GetField(item.ToString());
            var attribute = fi.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
            var title = attribute == null ? item.ToString() : ((DescriptionAttribute)attribute).Description;
            var listItem = new SelectListItem
                {
                    Value = ((int)item).ToString(),
                    Text = title,
                    Selected = selectedItem == ((int)item).ToString()
                };
            items.Add(listItem);
        }

        return new SelectList(items, "Value", "Text", selectedItem);
    }
}

として使う。

Html.EnumDropDownListFor(m => m.YourEnum);

更新

代替のHtmlヘルパーを作成しました。これらを使用するために必要なことは、ベースビューページを views\web.config .

彼らとなら、ただできる。

@Html2.DropDownFor(m => m.YourEnum);
@Html2.CheckboxesFor(m => m.YourEnum);
@Html2.RadioButtonsFor(m => m.YourEnum);

詳しくはこちら http://blog.gauffin.org/2011/10/first-draft-of-my-alternative-html-helpers/