2011-06-15 10 views
53

Sto utilizzando ASP.NET MVC 3 code-first e ho aggiunto annotazioni di dati di convalida ai miei modelli. Ecco un esempio modello:Convocazione manuale della convalida ModelState

public class Product 
{ 
    public int ProductId { get; set; } 

    [Required(ErrorMessage = "Please enter a name")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Please enter a description")] 
    [DataType(DataType.MultilineText)] 
    public string Description { get; set; } 

    [Required(ErrorMessage = "Please provide a logo")] 
    public string Logo { get; set; } 
} 

Nel mio sito ho un processo multi-step per creare un nuovo prodotto - fase 1 si entra dettagli del prodotto, la fase 2 altre informazioni ecc Tra ogni passo che sto memorizzando ogni oggetto (cioè un oggetto Product) nella sessione, in modo che l'utente possa tornare a quella fase del processo e modificare i dati inseriti.

Su ogni schermata ho la convalida sul lato client che funziona con la nuova multa di validazione jQuery.

La fase finale è una schermata di conferma dopo la quale il prodotto viene creato nel database. Tuttavia, poiché l'utente può passare da una fase all'altra, devo convalidare gli oggetti (Product e alcuni altri) per verificare che abbiano completato correttamente i dati.

C'è un modo per chiamare in modo programmatico la convalida ModelState su un oggetto che ha annotazioni di dati? Non voglio dover passare attraverso ogni proprietà sull'oggetto e fare la convalida manuale.

Sono aperto a suggerimenti su come migliorare questo processo se si rende più facile utilizzare le funzioni di validazione del modello di ASP.NET MVC 3.

risposta

68

È possibile chiamare il metodo ValidateModel all'interno di un'azione Controller (documentation here).

+12

Grazie, ho usato TryUpdateModel(), alla fine, quindi non ho avuto le eccezioni sollevate. –

2

Ho trovato questo per lavorare e fare esattamente come previsto .. mostra la ValidationSummary per un oggetto appena recuperato su un metodo di azione GET ... prima di qualsiasi POST

Me.TryValidateModel(MyCompany.OrderModel) 
35

È possibile utilizzare ValidateModel o TryValidateModel in ambito del controller.

Quando un modello viene convalidato, tutte validatori per tutte le proprietà sono periodo se almeno un ingresso maschera è associata ad una struttura modello. Il ValidateModel è simile al metodo TryValidateModel, tranne per il fatto che il metodo TryValidateModel non genera un'eccezione InvalidOperationException se la convalida del modello fallisce.

ValidateModel - lancia un'eccezione se il modello non è valido.

TryValidateModel - restituisce il valore bool che indica se il modello è valido.

Se si convalida un elenco di modelli uno per uno, è necessario ripristinare ModelState per ogni iterazione chiamando ModelState.Clear().

Link to MSDN

+0

Ho un campo obbligatorio che è null e utilizzato "ModelState.Clear()" e ModelState.IsValid è true. –

+1

Funziona quando inserisco "ModelState.Clear();" e "TryValidateModel (myModel);".Grazie –

+0

Questo può sembrare ovvio dopo averlo pensato, ma il tuo metodo personalizzato 'Convalida' ** non verrà chiamato ** se ci sono errori di convalida all'interno degli attributi di convalida. – Jess

Problemi correlati