Вопрос

Обновление 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();
}

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

Спасибо

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top