枚举下拉列表不是给我数值而是给我文本值

时间:2014-07-29 10:33:53

标签: c# asp.net asp.net-mvc enums

public static MvcHtmlString EnumDropDownListFor<TModel, TProperty, TEnum>(
                    this HtmlHelper<TModel> htmlHelper,
                    Expression<Func<TModel, TProperty>> expression, 
                    TEnum selectedValue)
        {
            IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum))
                                        .Cast<TEnum>(); 
            IEnumerable<SelectListItem> items = from value in values
                                                select new SelectListItem()
                                                {
                                                    Text = value.ToString(),
                                                    Value = value.ToString(),
                                                    Selected = (value.Equals(selectedValue))
                                                }; 
            return SelectExtensions.DropDownListFor(htmlHelper,expression, items);
        }

现在,上面的代码不是我的。它来自here,效果很好。您可以在视图中使用此功能,只需在Web.config Views文件夹下的value中添加名称空间即可。但有一点我无法解决。 Text给我的public enum OrderType { Foo = 1, Bar = 2 } View而不是数字。说,

@Html.EnumDropDownListFor(model => model.OrderTypeId, Model.OrderType as IEnumerable<SelectListItem>())

然后在<option value="Foo">Foo</option> <option value="Bar">Bar</option>

中使用它
<option value="1">Foo</option>
<option value="2">Bar</option>

这给了我:

{{1}}

我想要这个:

{{1}}

更新 在我提供给代码来自的链接中。它提供两种选择。真正有效的第一个。给我数值而第二个(我的问题中的代码)不给我数值(但仍然有效)。一直在寻找如何调整2号选项的方法,因为我觉得它更清洁。

应该怎样做才能达到这样的效果?非常感谢。

3 个答案:

答案 0 :(得分:1)

public static MvcHtmlString EnumDropDownListFor<TModel, TProperty, TEnum>(
                this HtmlHelper<TModel> htmlHelper,
                Expression<Func<TModel, TProperty>> expression,
                TEnum selectedValue)
            where TEnum : struct, IConvertible
        {
            var values = Enum.GetValues(typeof (TEnum))
                .Cast<TEnum>().ToArray();

            var items = values
                .Select(x => new
                {
                    Text = x.ToString(CultureInfo.InvariantCulture),
                    Value = Convert.ChangeType(x, x.GetTypeCode()),
                    Selected = (x.Equals(selectedValue))
                })
                .Select(x => new SelectListItem
            {
                Text = x.Text,
                Value = x.Value == null
                    ? ""
                    : x.Value.ToString(),
                Selected = x.Selected
            });

            return htmlHelper.DropDownListFor(expression, items);
        }

答案 1 :(得分:0)

我认为您应该使用@Html.EnumDropDownListFor代替@Html.DropdownListFor

答案 2 :(得分:0)

public static MvcHtmlString EnumDropDownListFor<TModel, TProperty, TEnum>(
                this HtmlHelper<TModel> htmlHelper,
                Expression<Func<TModel, TProperty>> expression, 
                TEnum selectedValue)
    {
        IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum))
                                    .Cast<TEnum>(); 
        IEnumerable<SelectListItem> items = from value in values
                                            select new SelectListItem()
                                            {
                                                Text = value.ToString(),
                                                Value = (int)value,
                                                Selected = (value.Equals(selectedValue))
                                            }; 
        return SelectExtensions.DropDownListFor(htmlHelper,expression, items);
    }