枚举toselectlist具有正确的值

时间:2017-03-29 04:27:58

标签: c# asp.net-mvc enums

使用ASPNET MVC 4,说我有一个枚举

public enum IndicatorGroup
    {
        Include_ANY_MatchingIndicator = 1,
        Include_ALL_MatchingIndicator = 2,
        Exclude_ANY_MatchingIndicator = 3,
        Exclude_ALL_MatchingIndicator = 4
    };

我使用以下帮助器方法将其绑定到下拉列表,如下所述:How do you create a dropdownlist from an enum in ASP.NET MVC?

public static class MyExtensions{
    public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
        where TEnum : struct, IComparable, IFormattable, IConvertible
    {
        var values = from TEnum e in Enum.GetValues(typeof(TEnum))
            select new { Id = e, Name = e.ToString() };
        return new SelectList(values, "Id", "Name", enumObj);
    }
}

现在我希望所选的值是一个数字(这可能在上面的代码中指定为)

Id = e ,

但是当我得到所选的值时,它会返回文本Exclude_ALL_MatchingIndicator而不是数字4.如何正确设置?

查看

 @Html.DropDownListFor(m => m.IndicatorGroups, Model.IndicatorGroups.ToSelectList(), new { @id = "ddlIndicatorGroup" })

1 个答案:

答案 0 :(得分:1)

您可以使用Convert.ToInt32(e),以便代码

var values = from TEnum e in Enum.GetValues(typeof(TEnum))
             select new { Id = Convert.ToInt32(e), Name = e.ToString() };
return new SelectList(values, "Id", "Name", Convert.ToInt32(enumObj));

但是,你真的不想这样做。如果属性IndicatorGroups的值为IndicatorGroup.Exclude_ANY_MatchingIndicator,则您的DropDownListFor()方法最初会显示第一个选项,因为该属性的值与任何选项值都不匹配。在内部,该方法基于第二个参数构建新的IEnumerable<SelectListItem>,并且如果属性的Selected值与任何{.ToString()属性匹配,则设置Value属性。 1}} - 在您的情况下,SelectListItem将与"Exclude_ANY_MatchingIndicator"123不匹配,因此将选择第一个选项(因为是)。

您已在评论中指出要将所选值保存为数据库中的4,在这种情况下,在POST方法中,将绑定值转换为INT。假设您在视图中选择第二个选项,那么模型的int属性将为IndicatorGroups。要将值保存为IndicatorGroup.Include_ALL_MatchingIndicator,请使用

int