asp.net 核心枚举模型绑定是否有替代属性而不是 EnumMemberAttribute?
Is there any alternates Attribute for asp.net core enum model binding instead of EnumMemberAttribute?
有一个枚举类型:
public enum Cat {
[EnumMember(Value = "white_cat")]
WhiteCat,
[EnumMember(Value = "black_cat")]
BlackCat
}
但是按照asp.net core 2.2模型绑定使用,会绑定失败:
public class A {
public Cat TheCat { get; set; }
}
public class XXXController : ControllerBase {
public ActionResult XXX([FromForm] Cat cat) {
// ...
}
}
参考:
public class EnumMemberConverter<T> : EnumConverter {
public EnumMemberConverter(Type type) : base(type) { }
public override object ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture,
object value) {
var type = typeof(T);
foreach (var field in type.GetFields()) {
if (Attribute.GetCustomAttribute(field, typeof(EnumMemberAttribute)) is EnumMemberAttribute attribute &&
value is string enumValue &&
attribute.Value == enumValue) {
return field.GetValue(null);
}
}
return base.ConvertFrom(context, culture, value);
}
}
用法:
[TypeConverter(typeof(EnumMemberConverter<Cat>))]
public enum Cat {
[EnumMember(Value = "white_cat")]
WhiteCat,
[EnumMember(Value = "black_cat")]
BlackCat
}
有一个枚举类型:
public enum Cat {
[EnumMember(Value = "white_cat")]
WhiteCat,
[EnumMember(Value = "black_cat")]
BlackCat
}
但是按照asp.net core 2.2模型绑定使用,会绑定失败:
public class A {
public Cat TheCat { get; set; }
}
public class XXXController : ControllerBase {
public ActionResult XXX([FromForm] Cat cat) {
// ...
}
}
参考:
public class EnumMemberConverter<T> : EnumConverter {
public EnumMemberConverter(Type type) : base(type) { }
public override object ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture,
object value) {
var type = typeof(T);
foreach (var field in type.GetFields()) {
if (Attribute.GetCustomAttribute(field, typeof(EnumMemberAttribute)) is EnumMemberAttribute attribute &&
value is string enumValue &&
attribute.Value == enumValue) {
return field.GetValue(null);
}
}
return base.ConvertFrom(context, culture, value);
}
}
用法:
[TypeConverter(typeof(EnumMemberConverter<Cat>))]
public enum Cat {
[EnumMember(Value = "white_cat")]
WhiteCat,
[EnumMember(Value = "black_cat")]
BlackCat
}