dedlfix: Validierung in MVC

Beitrag lesen

Tach!

es gibt ja ein Feld in Datenbank namens "Verbindung" von Typ float. Dieses Feld hat z.B. den Wert 123, der aus der Datenbank als Objekt ausgelen wurde und jestzt steht im Feld drin. Jetzt lösche ich diesen Wert aus dem Feld und klicke auf den Save-Button. In der Action-Methode hole ich wie vorhin erwähnt ein Objekt mit den aktuellen Inhalten vom Datenbak, in der auch im Feld Verbindung noch 123 steht. Nach dem UpdateModel(info) versucht nun die Methode etwas leeres (ich weiß nicht ob das ein String ist oder etwas anderes) in das Objekt für "Verbindung" reinzuschreiben. Da dieser Vorgang scheitert, wird ein Exception geworfen, in der steht dass das Modell nicht aktualisiert werden konnte. Da dieser Vorgang gescheitert ist, behält das Feld Verbindung in dem erwähnten Objekt seinen ursprünglichen Wert (123) bei, weil es ja nicht aktualiseirt werden konnte (durch Haltepunkt deutlich sichbar). Daher kann ich auch in meiner ValidierungsKlasse nicht herausfinden, ob nun das Feld leer ist oder nicht.

Beim Validieren ist es auch schon zu spät. Du prüfst ja nur noch auf Gültigkeit und nimmst nicht mehr die Eingabedaten entgegen. Das ist bereits in einem früheren Schritt passiert (und auch nicht Aufgabe der Validierung). Nun hast du ein Problem, dass du die Eingabedaten nicht mehr untersuchen kannst (kannst du doch, aber dann über das Request-Objekt), weil sie bereits in dein strongly-typed Model-Objekt überführt worden sind. Ein Null oder Leerstring passt da nicht in ein int. Da müsstest du schon int? (oder ausgeschrieben Nullable<int>) nehmen. Das passt aber nicht auf dein DBMS-Model, also müsstest du dir ein separates Model mit int? nur für die Eingabedaten erstellen. Nach der Validierung musst du dann die Daten in das DBMS-Model-Objekt übernehmen.

UpdateModel() sollte eigentlich gar nicht mehr gebraucht werden. Aktuelle ASP.NET-MVC-Versionen machen das anders, die übergeben gleich ein fertig gefülltes Objekt.

Nun bekomme ich allerdings die Deutschsprachige Meldung und nicht meine eigene. Kannst du bitte etwas näher beschreiben, wie "dazu dem Feld im Model eine Data Annotation hinzufügen: ein Required-Attribut mit ErrorMessage-Parameter." zu machen ist.

Das hängt davon ab, welchen ORM du verwendest. Generell hört das auf den Namen Data Annotations. Das sollte dir begegnet sein, wenn du ein ASP.NET-MVC-Tutorial durcharbeitest. Wenn du dein Model nach Code First erstellst, dann kannst du da die Attribute in den Propertys unterbringen. Bei Database First wird es schwieriger, weil da ein Script deinen Model-Klassen-Code erzeugt. Die Klasse ist zwar partial, und damit erweiterbar, aber das nützt bei Propertys nichts. Es lassen sich da keine Attribute hinzufügen. Der Ansatz ist da ein wenig anders über eine Hilfsklasse. Aber das findest du alles über die genannten Stichwörter.

dedlfix.