Frage

Ich benutze ASP.NET MVC 2.0 und ich versuche, die Modellbindung in meinem Controller und auch in der Modellstationsvalidierung zu nutzen. Ich bin jedoch gegen ein Problem gekommen und wollte es mit den Menschen hier teilen, um zu sehen, was Sie denken.

OK, ich habe meinen sauberen User POCO in meiner Modellklassenbibliothek ...

generasacodicetagpre.

Das Design, das ich gegangen bin, erlaubt nur, dass bestimmte Eigenschaften, die bearbeitet werden sollen, nachdem das Objekt erstellt wurde. Der Benutzername beispielsweise kann nur eingestellt werden, wenn das Objekt konstruiert ist, dass dies ein Sinn macht, ist jedoch der Schlüssel zu meinem Problem, also wollte ich es hier hervorheben.

Ich habe dann eine "Buddy-Klasse", die die Validierungsmetadaten für meine Benutzerklasse definiert ...

generasacodicetagpre.

}

In meiner Web-Layer möchte ich meinen Benutzern dazu bringen, dieses Objekt bearbeiten zu können. Also habe ich die folgenden zwei Aktionsmethoden in meinem Profilcontroller.

generasacodicetagpre.

Dies hat eine stark eingegebene Ansicht, um damit zu gehen ...

generasacodicetagpre.

ok, das ist der ganze Code aus dem Weg !!

Hier ist das Problem, die Ansicht wird nach der anfänglichen Get-Anfrage in Ordnung gemacht. Wenn der Benutzer jedoch das Formular zurückgibt, sagen Sie nach dem Bearbeiten des Anzeigenamens, ist der Modellstat nicht gültig. Dies liegt daran, dass die Eigenschaft der Benutzername einen privaten Setter darauf hat. Dies ist jedoch mit dem Design, für Sicherheit und Semantik, ich möchte niemals, dass sie ihren Benutzernamen ändern, sodass der Setter privat ist. Da ich jedoch das erforderliche Attribut an die Eigenschaft hinzugefügt habe, fehlgeschlagen ist es nicht, da er nicht eingestellt ist!

Die Frage ist, dass das Modellbinding dies als Validierungsfehler melden oder nicht?! Da die Immobilie privat ist, habe ich dafür konzipiert, dass er nicht eingestellt ist. Daher erwarte ich nicht, dass das Modellbindemittel es setzt, aber ich möchte keinen Validierungsfehler. Ich denke, es sollte nur Validierungsfehler für Eigenschaften erstellen, die er festlegen kann.

ok so mögliche lösungen, die ich bis jetzt aufgetreten bin ..

die Immobilie öffentlich machen.

Wenn ich dies tue, öffne ich mich, bis der Benutzername für den vorhandenen Benutzer geändert wird. Ich müsste irgendwo zusätzliche Logik hinzufügen, um dies zu fangen, nicht wirklich sehr nett. Ich müsste auch einen Bind-Ausschluss in der Aktionsmethode hinzufügen, um alle frechen Menschen zu stoppen, die versuchen, es über einen Pfosten einzustellen.

Entfernen Sie den Fehler

Ich glaube, ich kann den Fehler aus dem ModelState-Wörterbuch entfernen, dies wäre in dieser Gelegenheit in Ordnung, aber ich denke, dass dies ein paar Code-Geruch einführt, da ich dies für alle meine Objekte hinzufügen müsste, die private Setter haben müsste. Ich würde es wahrscheinlich vergessen !!

Geben Sie meine Ansicht stark an eine Schnittstelle ein

ein

Ich habe gelesen, dass einige Leute ihre Ansicht an eine Schnittstelle ihres Modells binden, dies ist König einer Modellansicht-Schnittstelle zum Geschäftsmodellobjekt. Ich mag diese Idee, aber ich verliere die Auto-Bindung und müsste meine Modellobjekte mit ihren Konstruktoren in meiner Webebene duplizieren, die nicht sicher ist?! Einige Infos hierin hier http://www.codethinked.com/post/2010/04/12/eeasy-and-sine-model-binding-in-inspnet-mvc.aspx .

Modellansichten verwenden

Das scheint mir einfach nicht trocken zu sein?! Ich bin froh, diese zu verwenden, wenn ich kein bestehendes Modellobjekt habe, das passt (zum Beispiel ich verwende eine Anmeldungsmodellansicht).

custommodelbinder

meine bevorzugte Option, aber ich bin mir nicht sicher, dass ich weiß, was ich tue !! Wenn ich das Bindemittel einfach bekommen könnte, um nur an Eigenschaften zu binden, die es einstellen kann, würde ich lachen !!

Was denken die Leute? Kommentare zu den oben genannten Optionen, alle anderen Lösungen, bin ich mit meiner Architektur nur von der Marke ?!

danke :)

War es hilfreich?

Lösung 3

jfar hat einen guten Link zu einem Beitrag von Brad Wilson, wo Brad kommentiert ...

Sie können immer noch Teilbearbeitung machen, sondern Sie können keine teilweise Validierung erstellen Mehr.Also, wenn Sie verbindlich ausschließen etwas mit dem [erforderlich] Attribut, dann wird die Validierung fehlschlagen. Sie haben ein paar Möglichkeiten, um herumzuarbeiten Dies:

  • Verwenden Sie ein Ansichtsmodell, das genau die Formatdaten widerspiegelt

  • Vorzufüllen [erforderlich], aber ungebundene Felder mit Daten, bevor Sie anrufen (Versuchen) UpdateModel, damit der Die Validierung wird erfolgreich sein (obwohl Sie beabsichtigen nicht, etwas mit zu tun diese Daten)

  • Erlauben Sie den Überprüfungsfehlern, die auftreten, und entfernen Sie sie dann von Modellstate nach der Validierung erfolgt, Da sind sie unangemessene Fehler.

Mein Fall scheint in den Fall "Partial Editing" passt, wo ich nicht möchte, dass bestimmte Felder aktualisiert werden sollen.

Ich werde diese als Lösungen untersuchen.

Andere Tipps

" Ich habe dafür konzipiert, dass er nicht eingestellt ist, daher erwarte, dass das Modellbindemittel nicht erwartet, dass das Modell-Bindemittel ihn einstellt, aber ich möchte keinen Bestätigungsfehler. Ich denke, es sollte nur Validierung erzeugen Fehler für Eigenschaften, die es einstellen können. "

Lesen Sie mehr über diese Entwurfsentscheidung hier:

http : //bradwilson.typedyPad.com/Blog/2010/01/inde/europa.com/en/Linhaltestelle/12.html?lang=en

Interessanterweise beschwerten sich die meisten Menschen das vollständige Gegenteil von dem, was Sie sich darüber beschweren. ;)

Sie sagen das System im Wesentlichen, dass etwas, das nicht eingestellt werden kann, immer eingestellt werden sollte. Ich würde also nicht sagen, dass MVC falsch funktioniert oder so etwas ist. Sie können nur ein unmögliches Szenario kodieren.


Insgesamt erreiche es nur die Schmerzpunkte der metadatabuddy-Technik. In erster Linie müssen Sie eine unterschiedliche Validierung für Neu- und Bearbeitungsszenarien haben.

" Wenn ich das tue, öffne ich mich auf, um den Benutzernamen für den vorhandenen Benutzer zu ändern. Ich müsste irgendwo zusätzliche Logik hinzufügen, um dies zu fangen, nicht wirklich sehr nett. Ich müsste auch eine hinzufügen Binden Sie die Action-Methode aus, um alle frechen Menschen anzuhalten, die versuchen, es über einen Pfosten einzustellen. "

IMHO Ihr Überessen mit diesen Code ändert sich. Sie würden einem einzigen Methodenaufruf eine einfache Zeichenfolge hinzufügen. Was ist die große Sache? Ich würde hier den pragmatischen Ansatz nehmen.

Ich würde ein View-Modell verwenden, weil es die beste Passform für den Job ist.Denken Sie nicht an die trockene Bedeutung, Sie können Eigenschaften auf zwei Objekten nicht wiederholen, denken Sie daran, dass sie nicht "Logik doppelte oder identische Daten anhand von identischen Daten an zwei Stellen anhalten".In diesem Fall wird die Semantik des Umgangs mit der Modellbindung nicht auf Ihr Domain-Modell übereinstimmen, sodass Sie einen Weg brauchen, um es zu übersetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top