2009-02-14 4 views
9

Ich habe eine Controller-Aktion, die eine Nullable DateTime als einen der Parameter hat, die aus einem Textfeld in meinem Formular kommt. Ich bemerkte, dass, wenn der Benutzer "blah" in dieses Textfeld eingeben würde, ich einen Null-Wert für den DateTime-Parameter zurückbekomme und ein Modellfehler automatisch hinzugefügt wird. In diesem Fall ist der ModelState-Fehler, der hinzugefügt wird, "Der Wert 'blah' ist nicht gültig".Wie können Sie die standardmäßige ModelState-Fehlermeldung in Asp.net MVC deaktivieren oder ersetzen?

Mein Problem ist, dass meine Website mehrere Sprachen unterstützt und daher muss ich diesen Fehler lokalisieren. Normalerweise validiere ich einfach die ModelState-Fehler und füge sie selbst hinzu, aber in diesem Fall kann ich es nicht loswerden. Wenn ich einen anderen ModelState-Fehler für dasselbe Textfeld hinzufüge, wird es nicht angezeigt.

Antwort

8

ich mit all den Antworten stark müssen nicht übereinstimmen Sie bisher erhalten haben. Keiner von ihnen beantwortet die von Ihnen gestellte Frage, wie die MVC-Fehlermeldungen lokalisiert werden sollen. Sie könnten eine Menge Mühe aufwenden, um diese einzelne Instanz des Problems zu bearbeiten, und haben immer noch das gleiche Problem mit den 50 anderen Fällen von MVC-Fehlernachrichten, wenn Sie Ihre Anwendung nicht tatsächlich lokalisieren. Sie sind in MvcResources.resx definiert, das sich im Ordner Resources des MVC-Quellcodes befindet (oder durchsuchen Sie einfach die Assembly mit Reflector). Insbesondere suchen Sie nach der Ressource Common_ValueNotValidForProperty. Sie würden diese Nachrichten lokalisieren, indem Sie eine lokalisierte Satellitenassembly bereitstellen, genauso wie Sie eine beliebige .NET-Anwendung lokalisieren. Die Besonderheiten der Internationalisierung/Lokalisierung in .NET-Anwendungen liegen außerhalb des Rahmens dieser Antwort, aber es gibt viele Bücher zu diesem Thema. Dies in MVC zu tun ist nicht anders als in jeder anderen Anwendung, außer dass in den meisten Fällen Lokalisierungen des Frameworks bereits verfügbar sind. MVC befindet sich noch in der Beta-Phase, daher ist es meines Wissens zur Zeit nur Englisch. Vermutlich wird sich das nach der Veröffentlichung ändern.

1

Ich würde dieses bestimmte Textfeld aus der Whitelist entfernen, die Sie an TryUpdateModel/Update-Modell übergeben und es "von Hand" validieren, anstatt es durch das Framework validiert zu bekommen. Alternativ können Sie versuchen, die ModelState-Fehlerauflistung zu durchlaufen, den zu löschenden Fehler zu finden und ihn zu löschen. Sagen Sie beispielsweise RemoveItem, sobald Sie herausgefunden haben, welchen Sie entfernen möchten.

BEARBEITEN: Wenn Sie den standardmäßigen ModelBinder verwenden, können Sie Ihren eigenen implementieren. Ich nahm an, dass Sie TryUpdateModel/UpdateModel verwendet haben, da Sie eigene Modellfehler generiert haben.

0

Ich könnte anrufen ModelState.Clear(); zu Beginn der Aktion. Aber ich bin mir nicht sicher, ob ich das bei jeder Aktion gerne mache.

0

Sie könnten den DateTime-Parameter auf Null setzen. Wenn nichts angegeben wird, wird der Fehler nicht zu ModelState hinzugefügt.

public ActionResult Method(Datetime? date) 
{} 

statt

public ActionResult Method(Datetime date) 
{}