Verwendung einer Schnittstelle als Modelltyp einer Teilansicht + Datenanmerkungen

8

Ich habe einen Fall, in dem eine komplexe Teilansicht eine unterschiedliche Validierung von Feldern erfordert, abhängig davon, wo die Teilansicht verwendet wird.

Ich dachte, ich könnte das umgehen, indem ich die Teilansicht eine Schnittstelle als Modelltyp nehme und zwei verschiedene ViewModels basierend auf der Schnittstelle implementiere. Die Datenanmerkungen in den beiden ViewModels wären unterschiedlich. Ich würde dann der Teilansicht eine Instanz des richtigen ViewModel bereitstellen.

Aber ich finde, dass die einzigen Anmerkungen, die erkannt werden, die auf der Schnittstelle selbst sind. DAs in den Interface-implementierenden ViewModel-Klassen werden ignoriert, obwohl dies die Objekte sind, die als Modelle übergeben werden. Also funktioniert mein Plan nicht.

Gibt es einen Weg dazu? Ein besserer Ansatz? Ich würde es vorziehen, die Teilansicht nicht in separate Ansichten aufzuteilen, wenn ich sie vermeiden kann.

ETA: Dies ist eine abgekürzte Version der Teilansicht, wie gewünscht:

%Vor%

Die echte Teilansicht ist ziemlich lang und hat eine Menge @if-Anweisungen, die das Rendering (oder nicht) von optionalen Abschnitten verwalten, aber es macht nichts Schwieriges.

    
Ann L. 27.03.2012, 20:29
quelle

3 Antworten

3

Meine Idee wird nicht funktionieren: Dieser Thread erinnerte mich daran, dass Klassen keine Attribute von ihren Schnittstellen erben. (Wie die Antwort darauf hinweist, was passieren würde, wenn zwei Interfaces dieselbe Eigenschaft mit unterschiedlichen Attributen angeben und beide von einer Klasse implementiert wurden?)

Es könnte mit einer gemeinsamen Basisklasse funktionieren. Das werde ich morgen versuchen.

Danke, alle zusammen.

    
Ann L. 27.03.2012, 22:53
quelle
2

Ann, du hast Recht. Ich habe meinen Kommentar gelöscht. Sie können eine Schnittstelle nicht über Ihre Ansicht zurückgeben. Ich weiß jedoch nicht, was genau Sie versuchen, da ich Ihren Code nicht sehen kann. Vielleicht so etwas? Ich übergebe eine Schnittstelle zur Ansicht, übergebe sie aber als erwartete Klasse. Auch hier bin ich mir nicht sicher, ob die Anwendung hier ist.

Nehmen wir an, Sie haben Klassen wie diesen :

%Vor%

Ihr Controller sieht aus wie :

%Vor%

Und Ihre Ansicht sieht so aus :

%Vor%     
anAgent 28.03.2012 04:01
quelle
1

Nun, eigentlich hast du eine sehr vernünftige Idee! und archiviert werden kann, verwenden Sie die nicht generische Version der HtmlHelper-Methoden (zB "@ Html.Editor" anstelle von "@ Html.EditorFor"), da die generischen Versionen die ModelMetadata neu erstellen (ich weiß nicht warum!) basierend auf dem generischen Parametertyp und nicht mit ModelMetadata der Ansicht. Furchtbar schrecklich, nicht wahr?

Hoffe diese Hilfe.

    
Rafael Peña García 05.03.2013 19:47
quelle