Ошибки ModelState для всех свойств навигации - PullRequest
0 голосов
/ 12 марта 2019

У меня проблемы с моим 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.Однако, я не хочу, чтобы он выдавал ошибки валидации, конечно.

Редактировать: Выдает ошибку, говорящую о том, что свойство StandardName является обязательным.Очевидно, что это неотъемлемая часть свойства навигации.Я не хочу проверять свойство навигации на наличие ошибок.

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Вам следует создать новую модель, которая должна содержать только те элементы, которые будут опубликованы в качестве входных данных, и связать ее с вашей моделью данных в действии контроллера.Вы можете создать 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 голосов
/ 12 марта 2019

Добавление атрибута [Required] к свойству модели подвергнет его проверке. Удаление этого решит проблему. Однако, если вы не можете изменить его, как если бы он пришел из импортированной библиотеки классов, которую вы не можете изменить в своем решении, попробуйте создать отдельную модель для вашей модели запроса, у которой свойство StandardName не имеет атрибута [Required].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...