Ansichtsspezifische Modelle in ASP.NET MVC?

8

Ich bin relativ neu in MVC, also ist dies wahrscheinlich eine Novize-Frage.

Ich versuche, die besten Praktiken zu verstehen, um in einigen Szenarien, die nicht direkt auftauchen, eine klare Trennung der Bedenken zu bewahren.

Es gibt zwei Szenarien, die ich gerade betrachte. Stellen Sie sich eine sehr einfache App vor, mit der Benutzer Online-Profile für Rechtsanwälte anzeigen und bearbeiten können. Es gibt eine Aktion / Ansicht zum Anzeigen eines bestimmten Benutzerprofils und eine Aktion / Ansicht zum Bearbeiten eines bestimmten Benutzerprofils. Es ist einfach, sich eine schöne und saubere Model-Klasse vorzustellen, um die Details eines Benutzerprofils darzustellen, die möglicherweise mit dem Entity Framework erstellt und der SQL-Tabelle des Benutzerprofils zugeordnet wurden.

In der Ansicht action / view zum Anzeigen eines Benutzerprofils muss ich funktional eine Schaltfläche oder einen Link haben, über den ein Benutzer das Profil bearbeiten kann. Aber das sollte nur für einen Teil der Benutzer verfügbar sein. Zum Beispiel kann der Benutzer sein eigenes Profil bearbeiten. Außerdem können Superuser das Profil eines beliebigen Benutzers bearbeiten. Meine Frage ist, wie sollte die Ansicht entscheiden, ob der Link beim Rendern eines bestimmten Profils vorhanden sein soll. Ich nehme an, es ist falsch, dass die View die Logik enthält, um festzustellen, ob der aktuelle Benutzer das aktuelle Profil bearbeiten kann. Sollte ich der UserProfile-Modellklasse eine IsEditable-Eigenschaft hinzufügen? Das fühlt sich nicht tragisch an, aber es fühlt sich auch nicht ganz richtig an. Soll ich eine neue Model-Klasse erstellen, die das UserProfile mit zusätzlichen Informationen zur Sicherheit zusammenfasst?

Ein anderes Szenario ... Wenn Sie ein bestimmtes Profil bearbeiten, ist eines der Dinge, die bearbeitet werden können, die Liste der Spezialisierungen für einen bestimmten Anwalt. Die Liste der möglichen Spezialitäten ist nicht festgelegt. Wenn die Ansicht sie in einem Kombinationsfeld darstellen möchte, benötigt sie die Liste aller möglichen Besonderheiten aus der Datenbank. Die Ansicht sollte sie nicht direkt aus der Datenbank holen, also mache ich das Aggregatmodell noch einmal und stelle die Ansicht sowohl mit dem UserProfile als auch mit einer Liste gültiger Spezialgebiete zur Verfügung?

Ich denke, das generische Problem, das ich herausfinden möchte, ist, sollte ich mich damit behelfen, viele kleine Model-Klassen zu erstellen, die im Wesentlichen für einzelne Ansichten spezifisch sind. Jede Klasse würde die verschiedenen nicht verwandten Teile des größeren Domänenmodells enthalten, die für diese bestimmte Ansicht benötigt werden.

    
Erv Walter 05.02.2009, 14:14
quelle

4 Antworten

2

Für Ihr Szenario gebe ich einen anderen Parameter in ViewData, ViewData ["AllowEdit"] weiter, der auf "true" gesetzt ist, wenn die Ansicht den Bearbeitungslink anzeigen soll. Ich bevorzuge das Klonen des Modells in ein sichtspezifisches Modell, um dieses einzelne Attribut hinzuzufügen. Ich erstelle manchmal Ansichts-spezifische Modelle - zum Beispiel habe ich Grid ViewUserControl, das ein Grid-Modell verwendet, das ich aus einer beliebigen Liste anderer Modellklassen erzeugen kann - aber das würde ich in diesem Fall nicht tun.

Aus meiner Sicht würde ich so etwas tun:

%Vor%     
tvanfosson 05.02.2009, 14:22
quelle
3
Das

ViewModel -Muster ist speziell auf das von Ihnen beschriebene Szenario ausgerichtet. Sie können ViewData verwenden, aber dies ist die weniger empfohlene Lösung, da Sie viele Vorteile des ASP.NET MVC-Frameworks verlieren. Wenn Sie z. B. ViewData verwenden, haben Sie in Ihren Ansichten keine Unterstützung für Typsicherheit, Kompilierungszeitprüfung und Intellisense.

    
Bikal Lem 21.08.2010 19:25
quelle
1

Für Ihre erste Situation würde ich wahrscheinlich versuchen, die Logik dafür im Profilmodell zu kapseln, vielleicht mit einer Funktion wie CanEdit (), die Benutzerinformationsparameter akzeptiert und prüft, ob der Benutzer der Eigentümer des Profils ist oder ob sie Habe Superuser-Berechtigungen. Dann würde ich im Controller die Funktion aufrufen und die Ergebnisse mit ViewData an die View übergeben.

Rufen Sie als Nächstes in der Aktion zum Bearbeiten des Profilcontrollers die Spezialitätenliste (über das Modell) auf und übergeben Sie sie mit ViewData an die Ansicht.

    
Misko 05.02.2009 14:30
quelle
0

Sie können eine Basismodellklasse für alle Ihre Ansichtsmodellklassen erstellen und dort Informationen einfügen, die in vielen Ansichten als nützlich betrachtet werden können, auch wenn nicht in allen. Zum Beispiel die ID des aktuell angemeldeten Benutzers.

%Vor%

Dann können Sie aus Ihrer Sicht einen grundlegenden Vergleich machen:

%Vor%

Diese einfache Überprüfung ist ganz in Ordnung, es ist nicht viel von der Logik und sowieso sollte jemand entscheiden, ob dieser Link erscheinen soll. Sie können natürlich zwei verschiedene Ansichten machen, mit dem Link und ohne einen, aber es ist eher übertrieben.

    
User 05.02.2009 14:30
quelle

Tags und Links