将枚举绑定到LINQ和SelectListItem

时间:2009-02-16 15:10:44

标签: c# asp.net-mvc linq forms

我正在尝试绑定以下枚举

public enum CertificateTypes : byte
{
    None = 0,
    Original = 1,
    AuthenticatedCopy = 2,
    Numbered = 3
}

到数据库的tinyint列。但是,在创建SelectListItems并调用时,例如Person.CertificateTypes.Original.ToString() I get this:

<option value="Original">Original</option>

<option value="Original">Original</option> ?或者有没有办法让这项工作“自动化”?

3 个答案:

答案 0 :(得分:15)

如果您想自动化,可以使用

var enumValues = Enum.GetValues(typeof(CertificateTypes)).Cast<CertificateTypes>().Select(e => (byte)e);
var selectList = new SelectList(enumValues);

这里的问题是你只需要获取字节,所以你可能需要选择类似......的新类型。

var enumValues = Enum.GetValues(typeof(CertificateTypes)).Cast<CertificateTypes>()
                                                         .Select(e => new KeyValuePair<byte, string>((byte)e, e.ToString()));
var selectList = new SelectList(enumValues, "Key", "Value");

这将从枚举中获取可能的值,并将其转换为IEnumerable of CertificateTypes,然后获取每个值并将其转换为新的KeyValuePair。

有一点需要注意,如果您的枚举属性为[Flags]属性,那么通常最好只让您的枚举复数化。否则我会把它命名为单数。

得爱LINQ!

答案 1 :(得分:1)

不确定以下内容如何转换为ASP.NET / MVC中的SelectListItems,因为我没有经验,但也许这可能有用。


当然,您必须专门将枚举转换为类似(byte)Person.CertificateTypes.Original的基础类型,以使其与数据库良好对话。

在WinForms中,我使用IList KeyValuePair<byte,string>绑定到ComboBox,使用以下内容:

foreach (Enum value in Enum.GetValues(typeof(CertificateTypes))
    MyBindingIList.Add(new KeyValuePair<byte,string>((byte)value, value.ToString()));

然后我绑定ComboBox并将DisplayMember设置为"Value",将ValueMember设置为"Key"。 (您可以将Key中的ValueKeyValuePair切换为适合您的任何内容。对我来说,密钥来自数据库,因此成为数字类型是有意义的。)

答案 2 :(得分:0)

我真的怀疑在枚举上调用ToString()会返回xml ...你能澄清 正在发生什么吗?您可能希望将枚举转换为byte / int(并且在大多数情况下以数字方式工作),或者在某些时候使用Enum.Parse - 但是如果不了解它是如何得到它的话很难说迷上了......