【问题标题】:ASP .NET CORE simple parameter validationASP .NET CORE 简单参数验证
【发布时间】:2022-04-26 05:24:24
【问题描述】:

是否可以使用简单参数的属性进行一些验证,例如:

[HttpGet("test/{type}")]
public ActionResult  GetSomeData([Range(0,2)]byte type)
{
  if (!ModelState.IsValid)
  {
    // isValid is always TRUE
  }
  ...
}

当您调用/controller/test/4 时,IsValid 始终是TRUE

有没有更简洁的方法来做到这一点?

【问题讨论】:

标签: c# validation asp.net-core


【解决方案1】:

从 2.1 版开始,此功能现已开箱即用;在调用 ModelState.IsValid 时,动作参数上的数据注释也将受到尊重,方式与在模型上的方式相同。

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-2.1#top-level-node-validation

如果您使用ApiController 属性注释您的类,验证也将自动执行,并且将返回 400 错误请求以及无效数据的详细信息,而无需自己调用 ModelState.IsValid

https://docs.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#automatic-http-400-responses

【讨论】:

  • 这个答案对我帮助很大。还值得一提的是,您可以使用 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); 将兼容性设置为不同的版本;您还可以使用 services.AddMvc(options => { options.AllowValidatingTopLevelNodes = false; }); 设置参数(“顶级节点”)的行为都在 Startup.ConfigureServices 方法中
【解决方案2】:

您可以创建自定义过滤器属性来指示 MVC 管道进行验证:

public class ValidateActionParametersAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var descriptor = context.ActionDescriptor as ControllerActionDescriptor;

        if (descriptor != null)
        {
            var parameters = descriptor.MethodInfo.GetParameters();

            foreach (var parameter in parameters)
            {
                var argument = context.ActionArguments[parameter.Name];

                EvaluateValidationAttributes(parameter, argument, context.ModelState);
            }
        }

        base.OnActionExecuting(context);
    }

    private void EvaluateValidationAttributes(ParameterInfo parameter, object argument, ModelStateDictionary modelState)
    {
        var validationAttributes = parameter.CustomAttributes;

        foreach (var attributeData in validationAttributes)
        {
            var attributeInstance = CustomAttributeExtensions.GetCustomAttribute(parameter, attributeData.AttributeType);

            var validationAttribute = attributeInstance as ValidationAttribute;

            if (validationAttribute != null)
            {
                var isValid = validationAttribute.IsValid(argument);
                if (!isValid)
                {
                    modelState.AddModelError(parameter.Name, validationAttribute.FormatErrorMessage(parameter.Name));
                }
            }
        }
    }
}

然后将其添加到动作中:

[HttpGet("test/{type}")]
[ValidateActionParameters]
public ActionResult GetSomeData([Range(0, 2)]byte type)
{
    if (!ModelState.IsValid)
    {
       // isValid has correct value
    }
}

【讨论】:

猜你喜欢
  • 2021-08-03
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2018-02-04
  • 2020-11-06
  • 2020-08-07
  • 2019-08-17
相关资源
最近更新 更多