Возможно ли обновить ModelState.IsValid вручную? - программирование
Подтвердить что ты не робот

Возможно ли обновить ModelState.IsValid вручную?

Я хотел бы использовать встроенные функции проверки, насколько это возможно. Я также хотел бы использовать ту же модель для методов CRUD.

Однако, поскольку выпадающий список не может быть выполнен с использованием стандартного шаблона, я должен его проверить вручную. В методе post back, я хотел бы просто проверить раскрывающийся список и добавить этот результат в ModelState, чтобы мне не пришлось проверять все остальные параметры, которые выполняются с помощью Data Annotation. Можно ли это достичь?

Я могу ошибаться в раскрывающемся списке, но из того, что я прочитал, имя объекта Html для выпадающего списка не может быть таким же, как свойство в Модели, чтобы правильно установить выбранное значение. Можно ли использовать Data Annotation с этим обходным путем?

Спасибо.

4b9b3361

Ответ 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
    }
}