2009-02-14 5 views
9

Ho un'azione controller che ha un valore DateTime nullable come uno dei parametri che proviene da una casella di testo sul mio modulo. Ho notato che se l'utente dovesse digitare "blah" in quella casella di testo, otterrò un valore Null per il parametro DateTime e un errore del modello verrà aggiunto automaticamente. In questo caso, l'errore ModelState che viene aggiunto è "Il valore 'blah' non è valido".Come si spegne o si sostituisce il messaggio di errore predefinito ModelState in Asp.net MVC?

Il mio problema è che il mio sito supporta più lingue e quindi ho bisogno di localizzare questo errore. Normalmente convalido e aggiungo solo gli errori ModelState ma in questo caso non riesco a liberarmene. Se aggiungo un altro errore ModelState per la stessa casella di testo non viene visualizzato.

risposta

8

Non sono d'accordo fortemente con tutte le risposte che hai ricevuto finora. Nessuno di loro in realtà risponde alla domanda che hai chiesto, che è come localizzare i messaggi di errore MVC. Potresti dedicare molto impegno a risolvere questa singola istanza del problema e avere ancora lo stesso problema con gli altri 50 casi di messaggi di errore MVC se in realtà non localizzi la tua applicazione. Sono definiti in MvcResources.resx, che si trova nella cartella Risorse del codice sorgente MVC (o semplicemente sfoglia l'assieme con Reflector). In particolare, stai cercando la risorsa Common_ValueNotValidForProperty. Dovresti localizzare questi messaggi fornendo un assembly satellite localizzato, nello stesso modo in cui localizzi qualsiasi applicazione .NET. Le specifiche di internazionalizzazione/localizzazione in applicazioni .NET sono al di fuori dello scopo di questa risposta, ma ci sono molti libri sull'argomento. Fare questo in MVC non è diverso rispetto a farlo in qualsiasi altra applicazione, tranne che, nella maggior parte dei casi, le localizzazioni del framework sono già disponibili. MVC è ancora in beta, quindi è, per quanto ne so, solo in inglese, al momento. Presumibilmente, questo cambierà dopo il rilascio.

1

Rimuoverei quella casella di testo specifica dalla whitelist che si passa a TryUpdateModel/Update model e convalidarla "a mano", anziché farla convalidare dal framework. In alternativa, è possibile provare a ripetere la raccolta degli errori ModelState, trovare quello che si desidera rimuovere ed eliminarlo, ad esempio utilizzando RemoveItem dopo aver individuato quale si desidera eliminare.

EDIT: Se si utilizza il default ModelBinder, è possibile implementare il proprio. Supponevo che dal momento che stavi generando i tuoi errori di modello, stavi usando TryUpdateModel/UpdateModel.

0

Potrei chiamare ModelState.Clear(); all'inizio dell'azione. Ma non sono sicuro che mi piaccia doverlo fare in ogni azione.

0

È possibile rendere nullable il parametro DateTime. Quindi, se non viene fornito nulla, l'errore non verrà aggiunto a ModelState.

public ActionResult Method(Datetime? date) 
{} 

piuttosto che

public ActionResult Method(Datetime date) 
{}