所有导航属性的ModelState错误

问题描述 投票:-1回答:2

我的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部分。我不想检查导航属性是否有错误。

c# entity-framework asp.net-web-api modelstate
2个回答
2
投票

您应该创建一个新模型,该模型应仅包含将作为输入发布的项目,并在控制器操作中与您的数据模型进行通信。你可以在你的情况下创建一个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) {
    ...
}

0
投票

将[Required]属性添加到model属性将使其经过验证。删除它将解决问题。但是,如果您无法更改它,就好像它来自您无法在解决方案中修改的导入类DLL,请尝试为您的请求模型创建一个单独的模型,其中StandardName属性没有[Required]属性。

© www.soinside.com 2019 - 2024. All rights reserved.