ModelState.AddModelError - Come posso aggiungere un errore che non è per una proprietà?


190

Sto controllando il mio database Create(FooViewModel fvm){...}per vedere se fvm.prop1e fvm.prop2già esiste in quella combinazione; in tal caso, voglio aggiungere un errore a modelstate, quindi restituire l'intera vista. Provai:

public ActionResult Create(FooViewModel fvm){
    if (ThatComboAlreadyExists(fvm)) {
      ModelState.AddModelError("Model", "There is already one like that");
      return View(fvm);
    }
}

... ma non visualizzo alcun errore nel Html.ValidationSummary, che è dove suppongo che apparirebbero. Ho il sospetto che "Model" non sia la chiave giusta, ma non sono riuscito a trovare nulla su Google.


Risposte:


330

Alla fine mi sono imbattuto in un esempio dell'uso che stavo cercando: assegnare un errore al Modello in generale, piuttosto che una delle sue proprietà, come al solito si chiama:

ModelState.AddModelError(string key, string errorMessage);

ma usa una stringa vuota per la chiave:

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");

Il messaggio di errore si presenterà <%: Html.ValidationSummary() %>come previsto.


22
Questo caso mi fa pensare: perché non esiste un metodo simile ModelState.AddError(errorMessage)o ModelState.AddGlobalError(errorMessage)... sarebbe intuitivo e più semplice scoprire come aggiungere un messaggio di errore non correlato alle proprietà di alcun modello.
Rubens Mariuzzo,

@Rubens: vero, ma puoi facilmente aggiungere un tale metodo con metodi di estensione.
Johnny5,

2
Puoi anche visualizzare l'errore usando@Html.ValidationMessage(string.Empty)
Ben Foster il

essendo la chiave la proprietà del tuo modello associata alla vista - che ha l'errore - solo per essere chiari.
Niico,

1
Il ValidationSummaryErrors(bool excludePropertyErrors)sovraccarico visualizzerà tutti gli errori di convalida se l'argomento è falso o solo errori non specifici della proprietà (chiave = "") se l'argomento è vero.
Suncat2000,

26

Puoi aggiungere l'errore del modello su qualsiasi proprietà del tuo modello, suggerisco se non c'è nulla di correlato per creare una nuova proprietà.

Ad esempio, controlliamo se l'e-mail è già in uso nel DB e aggiungiamo l'errore alla proprietà Email nell'azione, quindi quando restituisco la vista, sanno che c'è un errore e come mostrarlo utilizzando

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>

e

ModelState.AddModelError("Email", Resources.EmailInUse);

1
Questo sembra controintuitivo nel mio caso: sto verificando se esiste una particolare combinazione di col1 e col2 nel database, quindi non sembra giusto avere la proprietà IsDuplicateOfAnotherRow sul mio ViewModel. A quanto pare, puoi aggiungere un errore al tuo modello - vedi la mia risposta.
Scott Baker,

1
C'è un modo per ottenere la stringa "Email" per AddModelError senza usare una fragile stringa letterale? Come (m=>m.email).SomeMagicToString()?
Snekse,

Non credo, devi andare con la corda magica ... non la migliore ma comunque una buona soluzione
VinnyG

4
L' nameofoperatore che arriva in C # 6.0 risolve questo problema di stringa magica. msdn.microsoft.com/en-us/magazine/dn802602.aspx
RJ Cuthbertson

3

Mettere la proprietà del modello dot nelle stringhe ha funzionato per me: ModelState.AddModelError("Item1.Month", "This is not a valid date");


2
Ciò mostrerebbe effettivamente un mese non valido nell'interfaccia utente, ma non risolve il problema originale.
Scott Baker,

2
Il problema originale deriva dal non capire quale "chiave" rappresenta nel metodo. Questo fa luce su come funziona "chiave", quindi è bene sapere che chiave non deve essere solo un nome di proprietà, ma può anche fare riferimento a proprietà nidificate o al valore speciale String.Empty.
Triynko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.