ModelState.key是无效的属性名称。你发送
null
因此属性名称为空。但在我的测试中,关键是一个“$”
您可以尝试以下代码。
ViewModel.cs
public class ViewModel
{
public int Number { get; set; }
}
ProblemDetails.cs
public class ProblemDetails
{
public string Type { get; set; }
public string Title { get; set; }
public int Status { get; set; }
public string Detail { get; set; }
public string Instance { get; set; }
public Dictionary<string, string> Extensions { get; set; }
}
程序.cs
builder.Services.Configure<ApiBehaviorOptions>(options
=> options.SuppressModelStateInvalidFilter = true);
控制器
[HttpPost("test")]
public IActionResult test(ViewModel viewModel)
{
if (!ModelState.IsValid)
{
var problemDetails = new ProblemDetails
{
Type = "123",
Title = "Invalid parameters",
Status = StatusCodes.Status400BadRequest,
Detail = "Your request parameters didn't validate.",
Instance = "",
Extensions = new Dictionary<string, string>()
};
foreach (var b in ModelState)
{
problemDetails.Extensions.Add(b.Key, b.Value.Errors.FirstOrDefault().ErrorMessage);
}
return Ok(problemDetails);
}
return Ok(viewModel);
}
测验
您可以将代码放在ActionFilter中。
ValidationFilterAttribute.cs
public class ValidationFilterAttribute : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
var problemDetails = new ProblemDetails
{
Type = "123",
Title = "Invalid parameters",
Status = StatusCodes.Status400BadRequest,
Detail = "Your request parameters didn't validate.",
Instance = "",
Extensions = new Dictionary<string, string>()
};
foreach (var b in context.ModelState)
{
problemDetails.Extensions.Add(b.Key, b.Value.Errors.FirstOrDefault().ErrorMessage);
}
context.Result = new ObjectResult(problemDetails);
}
}
public void OnActionExecuted(ActionExecutedContext context) { }
}
程序.cs
builder.Services.AddScoped<ValidationFilterAttribute>();
builder.Services.Configure<ApiBehaviorOptions>(options
=> options.SuppressModelStateInvalidFilter = true);
控制器
[HttpPost("test")]
[ServiceFilter(typeof(ValidationFilterAttribute))]
public IActionResult test(ViewModel viewModel)
{
return Ok(viewModel);
}
结果过滤器与操作过滤器
ActionFilter and ResultFilter different and Examples