Ric*_*ard 15 asp.net-mvc-4 asp.net-web-api
如何使JSON.NET/MVC 4 WebAPI拒绝枚举没有成员的整数值?例如:
如果我有这个型号:
public enum Colour { Red = 1 };
public class Model
{
public Colour Colour { get; set; }
}
Model Post(Model model)
{
// model.Colour could be 99, 34234234, 0 etc, etc
}
Run Code Online (Sandbox Code Playgroud)
如果我发布{ Color: 9999 },我最终得到一个模型,其中model.Color = 999,我想要返回一个错误的请求状态代码.
Tec*_*ium 28
事实证明,EnumDataTypeAttribute与System.ComponentModel.DataAnnotations命名空间中的现成 ValidationAttributes一起提供了Enum.Defined检查.
将此属性应用于视图模型后,超出范围的整数值验证失败:
public enum Color {Red = 1, Blue = 2}
public class Car
{
[EnumDataType(typeof(Color))]
public Color Color { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
注意:由于枚举模型绑定的默认行为,可以解析为枚举上定义的整数的值仍将通过验证.这意味着,例如,true将被解析为1,这对于此枚举有效.我假设可以映射到整数的字符也可以工作.
如果您只想要一种enum解析方式,无论是字符串还是整数,请考虑在视图模型上使用该特定类型,然后编写一个ValidationAttribute接受枚举类型的自定义,验证视图模型上的字符串或整数匹配枚举中的值.
Kob*_*obi 23
一种选择是编写验证器:
public class ValidEnumValueAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
Type enumType = value.GetType();
bool valid = Enum.IsDefined(enumType, value);
if (!valid)
{
return new ValidationResult(String.Format("{0} is not a valid value for type {1}", value, enumType.Name));
}
return ValidationResult.Success;
}
}
Run Code Online (Sandbox Code Playgroud)
用于:
public enum Color {Red = 1, Blue = 2}
public class Car
{
[ValidEnumValue]
public Color Color { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在控制器中,ModelState.IsValid将是false.
你也可以抛出一个ValidationException,如果你真的想要失败的请求,但我不太确定它们应该如何使用.
| 归档时间: |
|
| 查看次数: |
8208 次 |
| 最近记录: |