Подтвердить что ты не робот

Могу ли я проверить модельное состояние без привязки к модели?

Я получаю мочи от Entity Framework, и мне интересно, есть ли способ проверить состояние модели без привязки к модели.

Предположим, что я создаю пользователя в основном из кода, есть ли способ проверить, что он действителен в соответствии с моими предопределенными аннотациями данных до того, как я обновляю?

    public ActionResult Index()
    {
        User u = new User();
        u.Username = "test";
        u.Password = "test";
        u.Email = "test";

        DefaultContext db = new DefaultContext();            

        if (ModelState.IsValid)
        {
            db.Users.Add(u);
            db.SaveChanges();
            Response.Write(u.Id);
        }
        else
            // model is not valid

        return View();
    }

Вышеприведенный код не работает, потому что нет привязки. Или, может быть, я запутался в этом процессе.

Спасибо.

4b9b3361

Ответ 1

ModelState не будет доступен, потому что он настроен на привязку модели. ModelBinder не привязывал модель, поэтому не выполнял проверку, поэтому ModelState будет пустым.

Но это не мешает вам использовать атрибуты и выполнять проверку.

Предполагая, что вы используете атрибуты DataAnnotation, вы можете запустить проверку без привязки к модели.

Учитывая этот класс:

public class Widget
{
    public int Id { get; set; }

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

    public decimal Price { get; set; }
}

Вы можете сделать это:

        var widget = new Widget
                        {
                            Id = 12,
                            Price = 15.57M
                        };

        var context = new ValidationContext(widget, null, null);
        var results = new List<ValidationResult>();
        if( Validator.TryValidateObject( widget, context, results, true ) )
        {
            //Validation Successful
        }
        else
        {
            //Validation Failed
        }

Свойство Name не было установлено, и TryValidateObject() завершится с ошибкой. Сбор результатов будет иметь фактическую ошибку, которая произошла.

Ответ 2

вы можете использовать TryValidateModel или ValidateModel

 User u = new User();
    u.Username = "test";
    u.Password = "test";
    u.Email = "test";


    if (TryValidateModel(u))
     {

     }else{

     }