Возможно ли обновить ModelState.IsValid вручную?
Я хотел бы использовать встроенные функции проверки, насколько это возможно. Я также хотел бы использовать ту же модель для методов CRUD.
Однако, поскольку выпадающий список не может быть выполнен с использованием стандартного шаблона, я должен его проверить вручную. В методе post back, я хотел бы просто проверить раскрывающийся список и добавить этот результат в ModelState, чтобы мне не пришлось проверять все остальные параметры, которые выполняются с помощью Data Annotation. Можно ли это достичь?
Я могу ошибаться в раскрывающемся списке, но из того, что я прочитал, имя объекта Html для выпадающего списка не может быть таким же, как свойство в Модели, чтобы правильно установить выбранное значение. Можно ли использовать Data Annotation с этим обходным путем?
Спасибо.
Ответы
Ответ 1
Вы можете использовать addModelError
ModelState.AddModelError(key,message)
когда вы его используете, это приведет к недействительности ModelState, поэтому isValid
вернет false.
Обновление
после просмотра комментария к ответу @Pieter
Если вы хотите исключить элемент, влияющий на результат isValid()
, вы можете использовать метод ModelState.Remove(field)
до вызова isValid()
.
Ответ 2
Другой вариант - наследовать IValidatableObject
в вашей модели. Внедрите его метод Validate
, и вы можете оставить все другие проверки на месте и написать любой код, который вы хотите в этом методе. Примечание: вы возвращаете пустой IEnumerable<ValidationResult>
, чтобы указать, что ошибок не было.
public class Class1 : IValidatableObject
{
public int val1 { get; set; }
public int val2 { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var errors = new List<ValidationResult>();
if (val1 < 0)
{
errors.Add(new ValidationResult("val1 can't be negative", new List<string> { "val2" }));
}
if (val2 < 0)
{
errors.Add(new ValidationResult("val2 can't be negative", new List<string> { "val2" }));
}
return errors;
}
}
EDIT: после повторного чтения вопроса я не думаю, что это применимо к этому делу, но я оставляю ответ здесь, если он помогает кому-то другому.
Ответ 3
Вы не можете вручную установить свойство ModelState.IsValid, но вы можете добавлять сообщения в ModelState, которые гарантируют, что IsValid является ложным.
ModelState.AddModelError();
Ответ 4
да, вы можете добиться этого (также вы будете использовать ту же модель для методов CRUD):
Пример МОДЕЛЬ
public class User
{
public virtual int Id{ get; set; }
public virtual Role Role { get; set; }
}
public class Role
{
[Required(ErrorMessage = "Id Required.")]
public virtual int Id { get; set; }
[Required(ErrorMessage = "Name Required.")]
public virtual string Name { get; set; }
}
Пример VIEW с проверкой в выпадающем списке
@Html.DropDownListFor(m => m.Role.Id, (SelectList)ViewBag.gRoles, "-- Select --")
@Html.ValidationMessageFor(m => m.Role.Id)
КОНТРОЛЛЕР: очистка необходимых (но не необходимых здесь) полей
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Creedit(User x)
{
x.Role = db.RoseSet.Find(x.Role.Id);
if (x.Role != null)
{
ModelState["Role.Name"].Errors.Clear();
}
if (ModelState.IsValid)
{
// proceed
}
else
{
// return validation error
}
}