- 首先,需要使用EnumMember属性为枚举成员提供别名。例如:
public enum MyEnum
{
[EnumMember(Value = "first-value")]
FirstValue = 1,
[EnumMember(Value = "second-value")]
SecondValue = 2,
[EnumMember(Value = "third-value")]
ThirdValue = 3
}
- 然后,创建一个自定义模型绑定器,该绑定器在反序列化查询字符串值时使用EnumMember值。例如:
public class EnumWithEnumMemberBinder : IModelBinder
{
private readonly IModelBinder _fallbackBinder;
public EnumWithEnumMemberBinder(IModelBinder fallbackBinder)
{
_fallbackBinder = fallbackBinder;
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var stringValue = valueProviderResult.FirstValue;
var enumType = bindingContext.ModelType;
if (stringValue is null || !enumType.IsEnum)
{
return _fallbackBinder.BindModelAsync(bindingContext);
}
foreach (var field in enumType.GetFields(BindingFlags.Public | BindingFlags.Static))
{
var memberAttribute = field.GetCustomAttribute();
if (memberAttribute != null && memberAttribute.Value == stringValue)
{
bindingContext.Result = ModelBindingResult.Success(Enum.Parse(enumType, field.Name));
return Task.CompletedTask;
}
else if (field.Name == stringValue)
{
bindingContext.Result = ModelBindingResult.Success(field.GetValue(null));
return Task.CompletedTask;
}
}
return _fallbackBinder.BindModelAsync(bindingContext);
}
}
- 最后,在控制器上使用模型绑定器特性,并为枚举类型指定创建的自定义模型绑定器。例如:
public IActionResult MyAction([FromQuery(BinderType = typeof(EnumWithEnumMemberBinder))] MyEnum myEnum)
{
// 处理枚举值