这是我的自定义响应模型:
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 - 为什么?
我期望作为输入发送的值是模型状态中的原始值。
值总是返回 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;