我正在尝试绑定以下枚举
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>
?或者有没有办法让这项工作“自动化”?
答案 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
中的Value
和KeyValuePair
切换为适合您的任何内容。对我来说,密钥来自数据库,因此成为数字类型是有意义的。)
答案 2 :(得分:0)
我真的怀疑在枚举上调用ToString()
会返回xml ...你能澄清 正在发生什么吗?您可能希望将枚举转换为byte / int(并且在大多数情况下以数字方式工作),或者在某些时候使用Enum.Parse
- 但是如果不了解它是如何得到它的话很难说迷上了......