Обновите ModelState, чтобы удалить ошибки - PullRequest
14 голосов
/ 23 октября 2009

Обновление ModelState

Привет, у меня вопрос по ModelState в контроллере ASP.NET MVC.

Когда пользователь выбирает определенную опцию в представлении, дата начала и дата окончания «сертификации» будут установлены на основе других введенных дат.

Проблема в том, что даты сертификации возвращаются как нулевые, а наш класс CertificationMetaData определяет поля как [Обязательные], поэтому ModelState становится недействительным, как только загружается действие.

Удаление ошибок ModelSate вручную позволяет этому работать, но мне было интересно, есть ли лучший способ сделать это? Есть ли способ обновить ModelState? Должен ли я сделать поля не обязательными? Или я должен добавить значение даты из представления с помощью JavaScript?

public ActionResult Create(FormCollection fc, Certification certification, Absence absence)
{
    if (certification.CertificationTypeID == 1)
    {
        certification.CertificationStartDate = absence.StartDate;
        certification.CertificationEndDate = absence.StartDate.AddDays(7);
        this.ModelState.Remove("CertificationStartDate");
        this.ModelState.Remove("CertificationEndDate");
    }

    if (this.ModelState.IsValid)
    {
        // save
        return RedirectToAction("Index");
    }
     return View();
}

Также, как вы можете видеть, я жестко закодировал значение идентификатора для типа сертификации. Каков наилучший способ сравнить значения со значениями таблицы поиска? Enum - лучший путь?

Спасибо

Ответы [ 2 ]

33 голосов
/ 15 марта 2012

Следующий подход обновляет состояние модели и позволяет поддерживать дизайн модели в соответствии с [обязательными] атрибутами и т. Д.

В моем случае я хочу, чтобы в моей модели было обязательное поле, которое обычные пользователи, использующие API, не могут изменить, поэтому я сделал это:

ModelState.Remove("ChangeDate");
ModelState.Add("ChangeDate", new ModelState());
ModelState.SetModelValue("ChangeDate", new ValueProviderResult(club.ChangeDate, DateTime.Now.ToString(), null));

Таким образом, вам не нужно удалять обязательные поля, а также не нужно указывать дату в javascript.

9 голосов
/ 24 октября 2009

Очевидно, что это личное дело, но я бы не стал удалять сообщения об ошибках.

Если бы я искал простое решение, то я бы удалил атрибут [Required] и добавил код проверки в контроллер, чтобы добавить ошибку, если даты отсутствовали, или установить их на альтернативное значение, если это был правильный тип.

Если бы я искал более сложное решение, я бы поставил валидацию на уровне модели. Возможно базовый класс или интерфейс, который должна реализовывать модель. Класс ValidationHelper со статическим методом Validate (объект IValidate), который проверяет атрибуты ValidationAttributes и вызывает метод Validate для Модели. Затем он возвращает коллекцию ValidationErrors. Затем будет написан пользовательский ModelBinder, который понимает проверку модели и сопоставляет их с ошибками ModelState.

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