ASP.NET Core Web API 中模型状态验证中的原始值始终为 null

问题描述 投票:0回答:1

这是我的自定义响应模型:

protected Error GenerateError()
{
    Error error = new Error();
    var details = new List<Detail>();

    if (!ModelState.IsValid)
    {
        foreach (var key in ModelState.Keys)
        {
            var a = ModelState[key];

            if (ModelState[key].ValidationState == ModelValidationState.Invalid)
            {
                var rawValue = ModelState[key].RawValue;
                var attemptedValue = rawValue != null ? rawValue.ToString() : null;
                var detail = new Detail()
                {
                    Field = key,
                    Value = attemptedValue,
                    Issues = ModelState[key].Errors.Select(o => o.ErrorMessage).ToList()
                };

                details.Add(detail);
            }
        }

        error.Details = details;
    }

    return error;
}

值总是返回 null - 为什么?

我期望作为输入发送的值是模型状态中的原始值。

c# .net .net-core asp.net-core-webapi
1个回答
0
投票

值总是返回 null - 为什么?

是因为你没有在

Error GenerateError()
中定义验证的模型类型,导致
ModelState.IsValid
返回true,因此返回null值。您应该定义模型验证类型以进行验证。但是
[ApiController]
属性可以让模型验证错误自动触发HTTP 400响应,它将返回默认的BadRequest响应。

如果想自定义模型验证的错误信息,可以尝试使用自定义的action过滤器在方法执行前验证参数。以下是您可以用作参考的示例:

public class CustomModelActionFilter : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
        throw new NotImplementedException();
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {

        var details = new List<Detail>();
        if (!context.ModelState.IsValid)
            {
                foreach (var key in context.ModelState.Keys)
                {
                    if (context.ModelState[key].ValidationState == ModelValidationState.Invalid)
                    {
                        var rawValue = context.ModelState[key].RawValue;
                        var attemptedValue = rawValue != null ? rawValue.ToString() : null;
                        var detail = new Detail()
                        {
                            Field = key,
                            Value = attemptedValue,
                            Issues = context.ModelState[key].Errors.Select(o => o.ErrorMessage).ToList()
                        };

                    details.Add(detail);
                    }
                }
                context.Result = new BadRequestObjectResult(details)
                {
                    StatusCode = 400 
                };
            }
            
    }
}

注册全局模型验证过滤器:

options.Filters.Add(new CustomModelActionFilter());

禁用系统内置模型验证:

options.SuppressModelStateInvalidFilter = true;

当我发送验证错误数据的消息时:

© www.soinside.com 2019 - 2024. All rights reserved.