我的WebApi和ModelState存在问题。每当我向我的API发送数据时,它都会在所有导航属性上抛出ModelState错误。这是我的模特:
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public int StandardId { get; set; }
public Standard Standard { get; set; }
}
public class Standard
{
public int StandardId { get; set; }
[Required]
public string StandardName { get; set; }
public ICollection<Student> Students { get; set; }
}
正如您所看到的,我没有分配虚拟关键字,因为我不想延迟加载,因此不应该成为问题。
这是我的API:
[HttpPut, Route("updateStudent/{id:int}")]
public IHttpActionResult Put(int id, Student student)
{
// ModelState throws an error here!!
if (ModelState.IsValid && id == student.StudentId) {
...
}
}
这是我的请求的样子:
{
"StudenID": 0,
"StudentName": "Tom",
"StandardId": 1
}
当我检查模型到达api时的样子时,我可以看到所有数据都已填充,它基本上用一个新的Standard实例替换了Standard属性。但是,我当然不希望它抛出验证错误。
编辑:它抛出错误说标准名称属性是必需的。显然这是导航属性的proprty部分。我不想检查导航属性是否有错误。
您应该创建一个新模型,该模型应仅包含将作为输入发布的项目,并在控制器操作中与您的数据模型进行通信。你可以在你的情况下创建一个ViewModel,如:
public class StudentViewModel
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public int StandardId { get; set; }
}
并相应地更改动作方法参数。
[HttpPut, Route("updateStudent/{id:int}")]
public IHttpActionResult Put(int id, StudentViewModel student)
{
if (ModelState.IsValid && id == student.StudentId) {
...
// map with your Student Entity here as per your needs
}
}
对于目前的解决方法,您可以从Standard
中删除那些ModelState
实体属性:
public IHttpActionResult Put(int id, Student student)
{
// ignore StandardName property
ModelState.Remove(nameof(student.Standard.StandardName));
if (ModelState.IsValid && id == student.StudentId) {
...
}
将[Required]属性添加到model属性将使其经过验证。删除它将解决问题。但是,如果您无法更改它,就好像它来自您无法在解决方案中修改的导入类DLL,请尝试为您的请求模型创建一个单独的模型,其中StandardName属性没有[Required]属性。