Обновите ModelState, чтобы удалить ошибки

Обновление ModelState

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

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

Проблема с этим - это даты сертификации, возвращаемые как null, и наш класс 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();
}

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

Спасибо

Ответ 1

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

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

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

Ответ 2

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

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

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

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