在哪里可以找到ASP.NET Core MVC中的模型绑定错误?

Nic*_*han 4 c# asp.net-core-mvc asp.net-core

在对对象执行模型绑定时,如果任何对象的属性存在类型不匹配,则框架似乎将返回null.例如,考虑这个简单的例子:

public class Client
{
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime RegistrationDate { get; set; }
}

public class ClientController : Controller
{
    [HttpPatch]
    public IActionResult Patch([FromBody]Client client)
    {
        return Ok("Success!");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我提交"ASDF"的HTTP请求年龄属性的值,整个客户端的参数将在贴片法空,不管什么已提交的其他属性.RegistrationDate属性也是一样.因此,当您的控制器操作中的FromBody参数为null时,您如何知道哪些错误导致模型绑定失败(在这种情况下,哪个提交的属性具有错误的类型)?

Pau*_*der 12

对不起以前的错误答案.正如您所说,MVC核心默认改变了MVC API处理模型绑定的方式.您可以使用当前的ModelState来查看哪些项目失败以及出于何种原因.

   [HttpPatch]
    [Route("Test")]
    public IActionResult PostFakeObject([FromBody]Test test)
    {
        foreach (var modelState in ViewData.ModelState.Values)
        {
            foreach (var error in modelState.Errors)
            {
              //Error details listed in var error
            }
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

存储在错误消息中的异常将显示如下内容:

Exception = {Newtonsoft.Json.JsonReaderException:无法将字符串转换为整数:派.在Newtonsoft.Json.JsonTextReader.FinishReadQuotedNumber(ReadType readType)的Newtonsoft.Json.JsonReader.ReadInt32String(String s)中路径'age',第1行,第28位...

但是,正如上面的评论中所述,Microsoft文档解释了以下内容:

如果绑定失败,MVC不会抛出错误.接受用户输入的每个操作都应检查ModelState.IsValid属性.

注意:控制器的ModelState属性中的每个条目都是包含Errors属性的ModelStateEntry.很少有必要自己查询这个集合.请改用ModelState.IsValid. https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding