Hello Razor MVC Guru:Razor MVC, dove inserire variabili globali accessibili attraverso la pagina principale, partiview e vista?
Domanda newbie.
Sfondo. Ho un'Identità personalizzata che è impostata su un HttpModule prima che arrivi al controller & visualizzazioni. Per usarlo, devo fare
MyIdentity myIdentity = (MyIdentity)((GenericPrincipal)context.User).Identity;
MyComplexUser user = myIdentity.User;
//user.name //user.location //user.username //etc
Il problema è, io uso l'oggetto in diversi luoghi come
- struttura master
- un certo livello sub layout nidificate
- Alcune partialviews
- Alcune viste
Davvero depe nds su quali proprietà dell'oggetto "MyComplexUser" richiedono le viste.
Attualmente, nelle viste, devo fare questo casting davvero complicato per arrivare a una proprietà. Ad esempio, se desidero il "Nome" dell'utente, devo fare
@ (((MyComplexUser) (((MyIdentity) ((GenericPrincipal) context.User) .Identity) .User)). Nome)
suppongo che ho potuto metterlo nei controllori e poi popolare il ViewBag con una proprietà ViewBag.MyUser, ma poi
- non mi piace usare ViewBag. Preferisco gli oggetti fortemente tipizzati
- Se uso un oggetto fortemente tipizzato ("MyUser") per le viste, allora devo popolare tutti quei modelli con una proprietà "MyUser". Ti senti un po 'sporco? Come mi piace mantenere i miei modelli puliti ed essere specifici per i punti di vista con cui sono coinvolti. Inoltre, diventa inutilmente ripetitivo.
- In luoghi come master_layout.cshtml o partialviews, come si accede a "MyUser" se li metto in un controller?
- Utilizzare RenderAction e creare viste parziali per ogni proprietà User è eccessivo?
Grazie. Ancora una volta, sono un principiante di MVC 4, ogni suggerimento è molto apprezzato.
Ho uno scenario simile. Lo posterò come commento, se preferisci potrei aggiungere una risposta: tutti i miei controller ereditano da un 'BaseController', che ho scritto. In questa classe base, ho cablato eventi del ciclo di vita, come ad esempio 'ExecuteCore'. Uso anche filtri per cose come questa. Dal lato della vista, tutti i miei viewmodels ereditano da 'BaseVM', dove inserisco proprietà comuni, come messaggi all'utente, nome utente e così via. –
@AndreCalil, potresti spiegarci un po 'di più? Quindi stai compilando un modello base dal controller di base, è così? Non riesco a ottenere la parte in cui si utilizzano i filtri, potresti fare un esempio? Inoltre, se sono state inserite le proprietà comuni nel modello di base, come si utilizza nella pagina di layout principale? do \\ @ Model BaseVM e quindi \\ @ Model.UserName? Grazie – Liming
Ecco qua. E non penso che questa sia una domanda per principianti –