C# 所有导航属性的ModelState错误

C# 所有导航属性的ModelState错误,c#,entity-framework,asp.net-web-api,modelstate,C#,Entity Framework,Asp.net Web Api,Modelstate,我的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

我的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; }
}
我的请求是这样的:

{
   "StudenID": 0,
   "StudentName": "Tom",
   "StandardId": 1
}
当我检查模型到达api时的样子时,我可以看到所有的数据都被填充了,它基本上用一个新的标准实例替换了Standard属性。但是,我当然不希望它抛出验证错误

编辑: 它抛出一个错误,指出StandardName属性是必需的。
显然,这是导航属性的一部分。我不想检查导航属性是否有错误。

您应该创建一个新模型,该模型应仅包含将作为输入发布的项目,并在控制器操作中与您的数据模型进行通信。您可以在您的案例中创建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
    }
}
对于目前的解决方案,您可以从ModelState中删除这些标准实体属性:


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

发生了什么错误?抱歉,忘了提及这一点。它告诉我StandardName属性是必需的@很抱歉,您的json包含StudenName而不是StudentNameTypo@EhsanSajjadTry在调用ModelState.IsValid之前清除导航属性的验证,方法是添加此行=>ModelState[Standard]。Errors.clear;所以如果我有大约50个模型,我需要再创建50个viewmodels?这是如何维护的?@TomelSafadi这是我们不直接向控制器操作公开数据模型的标准方法,这意味着通常不建议这样做so@TomelSafadi更新后的文章与周围的工作太多,但正如我所说,这是不推荐的approach@TomelSafadi:如果我有大约50个型号,我需要再创建50个viewmodels不,您应该为视图而不是模型创建视图模型。你的设计过程是错误的。我相信这一点,并将相应地改变它!谢谢大家的意见。这篇文章对我解释得很好:
[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
    }
}
public IHttpActionResult Put(int id, Student student)
{
     // ignore StandardName property
     ModelState.Remove(nameof(student.Standard.StandardName));

     if (ModelState.IsValid && id == student.StudentId) {
    ...
}