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