2012-01-31 10 views
5

definisco una variabile comeASP.MVC3 ModelState.IsValid non include RemoteAttribute controllo

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

e nel controller casa

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

ma quando controllo il ModelState.IsValid nell'azione Save, restituisce sempre true anche se riesco a visualizzare il messaggio di errore nella 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]
Come può l'assegno ModelState anche le regole di validazione da parte RemoteAttribure in un modello?

risposta

2

Hai due opzioni. È possibile implementare l'interfaccia IDataErrorInfo o IValidatableObject e ripetere qui la convalida. Queste interfacce sono supportate immediatamente da MVC e il tuo ModelState rifletterà questo.

L'altra opzione è la creazione del proprio attributo che deriva da RemoteAttribute. In questo attributo personalizzato, aggiungere la logica per applicare lo stesso lato di convalida del server.

L'ultima opzione è quella che vorrei fare, ma ci vuole un po 'più di tempo. This question dovrebbe aiutarti comunque.

+0

Grazie per il suggerimento! Il caso è che ho molti modelli del genere e voglio trovare l'opzione migliore per ridurre il codice. La prima e la seconda opzione devono essere codificate in base al numero di modello che utilizza l'attributo remoto. Puoi spiegare più dell'ultima opzione? – daniel

+2

Il metodo IsValid del RemoteAttribute viene effettivamente chiamato serveride. Se guardi questo metodo con un decompilatore .NET, vedrai che tutto questo metodo è "return true;". Creare il proprio attributo che deriva da RemoteAttribute e inserire alcune logiche di convalida effettive in tale metodo IsValid(). Ad esempio, è possibile creare una proprietà aggiuntiva sul proprio attributo, ad esempio ValidationMethod. Quando si utilizza l'attributo, è possibile passare il metodo che deve eseguire la convalida. E nel tuo metodo IsValid(), puoi chiamare quel metodo di convalida. –