Как вручную проверить модель с атрибутами? - программирование
Подтвердить что ты не робот

Как вручную проверить модель с атрибутами?

У меня есть класс под названием User и свойство Name

public class User
{
    [Required]
    public string Name { get; set; }
}

И я хочу проверить его, и если есть какие-либо ошибки, добавьте в контроллер ModelState или создайте экземпляр другого modelstate...

[HttpPost]
public ActionResult NewUser(UserViewModel userVM)
{
    User u = new User();
    u.Name = null;

    /* something */

    // assume userVM is valid
    // I want the following to be false because `user.Name` is null
    if (ModelState.IsValid)
    {
        TempData["NewUserCreated"] = "New user created sucessfully";

        return RedirectToAction("Index");
    }

    return View();
}

Атрибуты работают для UserViewModel, но я хочу знать, как проверять класс, не отправляя его в действие.

Как я могу это сделать?

4b9b3361

Ответ 1

Вы можете использовать Validator, чтобы выполнить это.

var context = new ValidationContext(u, serviceProvider: null, items: null);
var validationResults = new List<ValidationResult>();

bool isValid = Validator.TryValidateObject(u, context, validationResults, true);

Ответ 2

Я сделал запись в документации по переполнению стека, объясняющую, как это сделать:

Контекст проверки

Любая проверка требует контекста, чтобы дать некоторую информацию о том, что проверяется. Это может включать различную информацию, такую как проверяемый объект, некоторые свойства, имя, отображаемое в сообщении об ошибке и т.д.

ValidationContext vc = new ValidationContext(objectToValidate); // The simplest form of validation context. It contains only a reference to the object being validated.

После создания контекста существует несколько способов проверки.

Проверить объект и все его свойства

ICollection<ValidationResult> results = new List<ValidationResult>(); // Will contain the results of the validation
bool isValid = Validator.TryValidateObject(objectToValidate, vc, results, true); // Validates the object and its properties using the previously created context.
// The variable isValid will be true if everything is valid
// The results variable contains the results of the validation

Проверить свойство объекта

ICollection<ValidationResult> results = new List<ValidationResult>(); // Will contain the results of the validation
bool isValid = Validator.TryValidatePropery(objectToValidate.PropertyToValidate, vc, results, true); // Validates the property using the previously created context.
// The variable isValid will be true if everything is valid
// The results variable contains the results of the validation

И больше

Чтобы узнать больше о проверке вручную, смотрите:

Ответ 3

Поскольку вопрос касается конкретно ASP.NET MVC, вы можете использовать TryValidateObject внутри действия Controller.

Желаемая перегрузка метода - TryValidateModel(Object)

Проверяет указанный экземпляр модели.

Возвращает true, если проверка модели прошла успешно; иначе ложь.

Ваш измененный исходный код

[HttpPost]
public ActionResult NewUser(UserViewModel userVM)
{
    User u = new User();
    u.Name = null;

    if (this.TryValidateObject(u))
    {
        TempData["NewUserCreated"] = "New user created sucessfully";
        return RedirectToAction("Index");
    }

    return View();
}