1

问题说明了一切,我有一个 Web API 控制器操作,它需要一个 POCO。这是一个 POST 操作,我故意不将参数发布到操作,但是 ModelState.IsValid 属性仍然显示为 true。为什么会这样?我必须在控制器操作及其参数上设置一个属性来强制验证吗?

4

2 回答 2

1

Null 是对象的有效值。使 POCO 中的属性 [必需] 以强制检查。

于 2013-03-24T23:10:30.853 回答
0

有类似的问题。你有一个合理的担忧。请看一下:

https://blog.markvincze.com/how-to-validate-action-parameters-with-dataannotation-attributes/

数据注释救援:

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));
                }
            }
        }
    }
}

然后使用它:

 [ValidateActionParameters]
 public IActionResult Post([FromBody][Required]Product product)  
于 2017-06-15T12:09:31.537 回答