ASP.NET Core 6.0+正确识别模型绑定失败的方法及场景
模型绑定失败的正确识别方法及相关场景咨询
我已查阅MSDN文档的以下内容:
- 模型属性无数据源
- 类型转换错误
我构造了一个Swagger请求无法绑定到服务器模型的场景,代码如下:
OrderController.cs
[HttpPost] public async Task<IActionResult> CreateAsync(OrderViewModel viewModel) { // 将模型映射并添加到数据库 // 返回201状态码 }
发送的请求输入为:
{ null }
这导致模型绑定失败,我通过FailedValidationResultFilter处理该情况:
FailedValidationResultFilter.cs
public class FailedValidationResultFilter : IResultFilter { public void OnResultExecuted(ResultExecutedContext context) { } public void OnResultExecuting(ResultExecutingContext context) { // 判断模型绑定是否失败 var hasModelBindingFailed = context.ModelState.Any(pair => String.IsNullOrEmpty(pair.Key)); if (hasModelBindingFailed) { // 处理模型绑定失败的逻辑 // 返回BadRequestObjectResult } // 处理验证属性失败的情况 var invalidParams = new Dictionary<String, String[]>(context.ModelState.Count); foreach (var keyModelStatePair in context.ModelState) { var key = keyModelStatePair.Key; var modelErrors = keyModelStatePair.Value.Errors; if (modelErrors is not null && modelErrors.Count > 0) { var errorMessages = modelErrors.Select(error => error.ErrorMessage).ToArray(); invalidParams.Add(key, errorMessages); } } var problemDetails = new ProblemDetails { Type = "123", Title = "Invalid parameters", Status = StatusCodes.Status400BadRequest, Detail = "Your request parameters didn't validate.", Instance = "" }; problemDetails.Extensions.Add(nameof(invalidParams), invalidParams); context.Result = new BadRequestObjectResult(problemDetails); } }
调试时发现模型绑定失败会生成两个ModelState键值对:
{ "", "Some error message" }{ "viewModel", "Again some error message" }
我目前通过检查ModelState中是否存在空键来判断模型绑定失败,但认为这种方法并不恰当。现咨询:
- 正确识别模型绑定失败的方法是什么?
- 还有哪些输入会导致模型绑定失败但不会出现空键?
内容的提问来源于stack exchange,提问作者phougatv
相关产品推荐
相关产品推荐

