2011-08-18 25 views
13

Me estoy mojando los pies con Entity Framework y me pregunto si hay alguna manera de verificar el estado del modelo sin que ocurra la vinculación del modelo.¿Puedo verificar el modelo de estado sin vinculación de modelo?

Digamos que creo un usuario principalmente desde el código, ¿hay alguna manera de verificar que sea válido de acuerdo con mis anotaciones de datos predefinidas antes de actualizar?

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(); 
    } 

El código anterior no funciona porque no ocurre ninguna vinculación. O tal vez estoy confundido del proceso.

Gracias.

Respuesta

17

ModelState no estará disponible porque está configurado por el archivador modelo. El ModelBinder no enlazó un modelo por lo que no ejecutó la validación, por lo que ModelState estará vacío.

Pero eso no le impide usar atributos y realizar la validación.

Suponiendo que está utilizando los atributos de DataAnnotation, puede ejecutar la validación sin vinculación del modelo.

Dada esta clase:

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

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

    public decimal Price { get; set; } 
} 

usted puede hacer esto:

 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 
     } 

La propiedad Name no se fijó y el TryValidateObject() fallará. La colección de resultados tendrá el error real que ocurrió.

+1

aprendo algo nuevo cada vez que vengo aquí. No tenía conocimiento de la función ValidateModel(). La respuesta de Jayantha también es correcta y mucho más fácil si usa ASP.Net MVC. La respuesta que di funcionará fuera del contexto de un controlador. –

+0

Lo anterior funciona muy bien al validar un modelo sin enviar un formulario, en cuyo caso el 'TryValidateModel' falla:' Cuando se valida un modelo, todos los validadores para todas las propiedades se ejecutan si al menos un formulario está vinculado a un modelo propiedad. Desde aquí: https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryvalidatemodel(v=vs.118).aspx – Alex

10

puede utilizar TryValidateModel o ValidateModel

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


    if (TryValidateModel(u)) 
    { 

    }else{ 

    } 
Cuestiones relacionadas