小编典典

MVC3 Razor DropDownListFor枚举

c#

试图将我的项目更新为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>

预先感谢您的建议!


阅读 300

收藏
2020-05-19

共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助手。使用它们所需要做的就是在中更改baseviewpage 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/

2020-05-19