2012-08-17 20 views
5

Quindi sto cercando di ottenere la chiave per un oggetto modello nel controller in modo che sia possibile aggiungere un AddModelError ad esso.Ottieni la "Chiave" per un modello fortemente digitato nel controller

A mio avviso io uso

@Html.ValidationMessageFor(model => model.Email) 

cosa è il codice equivalente per ottenere il nome Key di aggiungere nel controller in modo che attribuisce a questo ValidationMessage.

risposta

2
ModelState.AddModelError("Email", "the email is invalid"); 

Ma di solito non è qualcosa che dovresti fare manualmente nel controller, ma dovresti usare un validatore. Ad esempio potresti decorare questa proprietà Email con qualche attributo di annotazione dei dati di validazione o se sei come me usa FluentValidation.NET => in questo modo non dovresti farti domande sulle chiavi ma concentrarti sulla reale logica di validazione.

+0

La chiave sarà sempre il nome? Pensavo che questo fosse stato generato, quindi non era sempre garantito il nome dell'oggetto? –

+0

Sarà sempre lo stesso. –

+0

È sempre uguale al nome del campo. Basta essere cauti perché se si rinomina il campo (anche utilizzando ReSharper), non aggiornerà questa stringa perché corrispondono solo per coincidenza. Fortunatamente, credo che l'uso di una chiave sconosciuta non abbia effetti negativi (come la creazione di eccezioni della pagina), è l'equivalente dell'uso di "null". –

17

È possibile utilizzare un'estensione che fa la stessa cosa come HtmlHelpers, e che lavorerà per le proprietà nidificate:

public static class ModelStateExtensions 
{ 
    public static void AddModelError<TModel>(this ModelStateDictionary dictionary, Expression<Func<TModel, object>> expression, string errorMessage) 
    { 
    dictionary.AddModelError(ExpressionHelper.GetExpressionText(expression), errorMessage); 
    } 
} 

modo da poterlo utilizzare in questo modo:

ModelState.AddModelError<TModel>(i => i.Person.Name, "test"); 

equivalente a

ModelState.AddModelError("Person.Name", "test"); 

Genera lo stesso ID dell'Html. Nella fonte MVC fanno un po 'di sanitizzazione extra, ma con nomi normali che non dovrebbero essere un problema.

+2

Si è verificato un errore durante l'utilizzo. Se la proprietà è una struttura, l'espressione appare come Converti (proprietà) perché l'espressione restituisce un oggetto. In tal caso il testo dell'espressione valuta una stringa vuota. Raccomando di modificare la funzione in pubblico static void AddModelError (questo dizionario ModelStateDictionary, Expression > expression, string errorMessage) e chiamandolo come ModelState.AddModelError ((TModel i) => i. Person.Name, "test") – Sven

Problemi correlati