Hallo Razor MVC Gurus:Razor MVC, wo globale Variablen platziert werden können, die über Masterseite, Partiview und View zugänglich sind?
Newbie Frage.
Hintergrund. Ich habe ein benutzerdefiniertes IIdentity, das in einem HttpModule festgelegt wird, bevor es zu Controller & Aufrufe gelangt. Um es zu nutzen, ich habe
MyIdentity myIdentity = (MyIdentity)((GenericPrincipal)context.User).Identity;
MyComplexUser user = myIdentity.User;
//user.name //user.location //user.username //etc
Das Problem ist, zu tun, verwende ich das Objekt in verschiedenen Orten wie
- Masterlayout
- Einige Unter Ebene verschachtelten Layouts
- Einige partialviews
- Einige Ansichten
Es wirklich depe nds über welche Eigenschaften von "MyComplexUser" Objekt die Ansichten benötigen.
Derzeit, in den Ansichten, muss ich das wirklich komplizierte Casting tun, um zu einer Eigenschaft zu gelangen. Zum Beispiel, wenn ich den "Namen" des Benutzers möchte, muss ich tun
@ (((MyComplexUser) (((MyIdentity) ((GenericPrincipal) Kontext.User) .Identity) .User)). Name)
nehme ich, dass ich es in den Controllern setzen könnte und dann die ViewBag mit einer ViewBag.MyUser Eigenschaft bevölkern, aber dann
- ich mag es nicht ViewBag verwenden. Ich bevorzuge stark typisierte Objekte
- Wenn ich ein stark typisiertes Objekt ("MyUser") für Ansichten verwende, dann muss ich alle diese Modelle mit einer "MyUser" -Eigenschaft populär. Fühlt sich ein bisschen schmutzig an? Ich möchte meine Models sauber halten und auf die Ansichten eingehen, mit denen sie zu tun haben. Außerdem wird es unnötigerweise wiederholt.
- Wie können Sie in Orten wie master_layout.cshtml oder partialviews auf "MyUser" zugreifen, wenn ich sie in einen Controller lege?
- Verwenden Sie RenderAction und erstellen Sie Teilansichten für jede Benutzereigenschaft ist ein Overkill?
Danke. Auch hier bin ich ein Neuling bei MVC 4, jeder Vorschlag schätzt es sehr.
Ich habe ein ähnliches Szenario. Ich werde es als Kommentar veröffentlichen, wenn Sie möchten, kann ich als Antwort hinzufügen: Alle meine Controller erben von einem 'BaseController', den ich geschrieben habe. In dieser Basisklasse habe ich Ereignisse des Lebenszyklus verdrahtet, wie 'ExecuteCore'. Ich benutze auch Filter für solche Dinge. Auf der Betrachtungsseite erben alle meine Ansichtsmodelle von 'BaseVM', wo ich allgemeine Eigenschaften, wie Nachrichten an den Benutzer, Benutzernamen usw. platziere. –
@AndreCalil, könnten Sie ein bisschen mehr erklären? Sie bevölkern also ein Basismodell vom Basis-Controller, oder? Ich bekomme nicht den Teil, wo Sie Filter verwenden, können Sie ein Beispiel geben? Wenn Sie die allgemeinen Eigenschaften im Basismodell ausgefüllt haben, wie verwenden Sie sie dann in der Hauptlayoutseite? Do \\ @ Model BaseVM und dann \\ @ Model.UserName? Danke – Liming
Da gehen Sie. Und ich glaube nicht, dass das überhaupt eine Anfängerfrage ist. –