gpt4 book ai didi

data-annotations - ASP.NET Core Web API 中整数值的自定义模型验证器

转载 作者:行者123 更新时间:2023-12-05 07:36:03 25 4
gpt4 key购买 nike

我开发了一个自定义验证器属性类,用于检查我的模型类中的整数值。但问题是这个类是行不通的。我已经调试了我的代码,但在调试代码期间没有命中断点。这是我的代码:

public class ValidateIntegerValueAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
int output;

var isInteger = int.TryParse(value.ToString(), out output);

if (!isInteger)
{
return new ValidationResult("Must be a Integer number");
}
}

return ValidationResult.Success;
}
}

我还有一个 Filter 类,用于在应用程序请求管道中进行全局模型验证。这是我的代码:

public class MyModelValidatorFilter: IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
if (context.ModelState.IsValid)
return;

var errors = new Dictionary<string, string[]>();

foreach (var err in actionContext.ModelState)
{
var itemErrors = new List<string>();

foreach (var error in err.Value.Errors){
itemErrors.Add(error.Exception.Message);
}

errors.Add(err.Key, itemErrors.ToArray());
}

actionContext.Result = new OkObjectResult(new MyResponse
{
Errors = errors
});
}
}

带有验证的模型类如下:

public class MyModelClass

{

[ValidateIntegerValue(ErrorMessage = "{0} must be a Integer Value")]
[Required(ErrorMessage = "{0} is required")]
public int Level { get; set; }

谁能告诉我为什么属性整数验证类不起作用。

最佳答案

模型验证在模型从请求中反序列化后开始发挥作用。如果模型包含整数字段 Level 并且您发送的值无法反序列化为整数(例如“abc”),则模型甚至不会被反序列化。结果,也不会调用验证属性 - 只是没有验证模型。

由此看来,实现这样的ValidateIntegerValueAttribute意义不大。这种验证已经由反序列化器执行,在本例中为 JSON.Net。您可以通过检查 Controller 操作中的模型状态来验证这一点。 ModelState.IsValid 将设置为 false 并且 ModelState 错误包将包含以下错误:

Newtonsoft.Json.JsonReaderException: Could not convert string to integer: abc. Path 'Level', ...

还有一件事要补充:要使 Required 验证属性正确工作,您应该使基础属性可为空。如果没有这个,该属性将在模型反序列化器之后保留其默认值 (0)。模型验证无法区分缺失值和等于默认值的值。因此,为了正确使用 Required 属性,请将属性设置为可空:

public class MyModelClass
{
[Required(ErrorMessage = "{0} is required")]
public int? Level { get; set; }
}

关于data-annotations - ASP.NET Core Web API 中整数值的自定义模型验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49300906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com