2012-01-31 11 views
5

defino como una variableASP.MVC3 ModelState.IsValid no incluye la comprobación RemoteAttribute

public class EditModel 
{ 
    [Remote("IsNameAvailable", "Home", ErrorMessage = "Name is in use.")] 
    [Display(Name = "Name")] 
    public string Name{ get; set; } 
} 

y en el controlador principal

public JsonResult IsNameAvailable(string name) 
{ 
    if (duplicate) 
     return Json(false, JsonRequestBehavior.AllowGet); 
    else 
     return Json(true, JsonRequestBehavior.AllowGet); 
} 

pero cuando puedo comprobar el ModelState.IsValid en el Guardar acción, siempre devuelve verdadero, incluso puedo ver la pantalla del mensaje de error en la Vista.

public ActionResult Save(EditModel editModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     //Return to view and display error in view 
     return View("Home", editModel); 
    } 

    //Input data is valid and save record 
    Repository.Save(editModel.Name); 
} 

[Problema]
¿Cómo puede el cheque ModelState también las reglas de validación de RemoteAttribure en un modelo?

Respuesta

2

Tienes dos opciones. Puede implementar la interfaz IDataErrorInfo o IValidatableObject y rehacer la validación allí. Estas interfaces son compatibles con la versión de fábrica de MVC y su ModelState reflejará esto.

Su otra opción es crear su propio atributo que se deriva de RemoteAttribute. En este atributo personalizado, agregue lógica para aplicar la misma validación en el lado del servidor.

La última opción es la que yo buscaría, pero eso toma un poco más de tiempo. This question debería ayudarlo con eso.

+0

Gracias por su sugerencia! El caso es que tengo muchos modelos así y quiero encontrar la mejor opción para reducir el código. La primera y la segunda opción que necesita código depende del número de modelo que utiliza el atributo remoto. ¿Puedes explicar más sobre la última opción? – daniel

+2

El método IsValid de RemoteAttribute realmente recibe el nombre de servidor. Si observa este método con un descompilador .NET, verá que todo lo que este método hace es "return true;". Cree su propio atributo que se deriva de RemoteAttribute y coloque alguna lógica de validación real en ese método IsValid(). Por ejemplo, puede crear una propiedad adicional en su propio atributo, diga ValidationMethod. Al usar el atributo, puede pasar el método que debe realizar la validación. Y en su método IsValid(), puede llamar a ese método de validación. –

Cuestiones relacionadas