2011-12-20 13 views
15

Come/dove posso dichiarare un oggetto come @User in modo che possa essere referenziato globalmente in qualsiasi vista del rasoio usando @?Come esporre l'oggetto globale come @User nelle visualizzazioni del rasoio?

Qualcosa di simile a:

_LoginPartial.cshtml:

@if(Request.IsAuthenticated) { 
    <text>Signed In As <strong>@User.Identity.Name</strong> | 

ma invece riferimento il mio oggetto:

@if(this && that) { <text>@MyObject.GetData</text> } 
+1

Stai chiedendo come fare @User? O stai chiedendo come si fa @MyOwnObject? –

+0

Sì, @MyOwnObject. – JaJ

risposta

25

È possibile modificare il tipo di base di una pagina Razor ad uno dei il tuo esempio:

public class UserAwareViewPage : System.Web.Mvc.WebViewPage 
{ 
    public IPrincipal User { get { return Thread.CurrentPrincipal; } } 
} 

e quindi modificare il file di configurazione in questo modo:

<system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, 
    System.Web.Mvc, Version=3.0.0.0, 
    Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="Your.Namespace.UserAwareViewPage"> 
    <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
    </namespaces> 
    </pages> 
</system.web.webPages.razor> 

Phil Haack ha un ottimo blog post on this here.

In alternativa, è possibile aggiungere un metodo di estensione per System.Web.Mvc.WebViewPage (tipo di base per le pagine di rasoio) e utilizzare questa.

public static IPrincipal User(this System.Web.Mvc.WebViewPage page) 
{ 
    return Thread.CurrentPrincipal; 
} 

Che sarebbe utilizzabile in questo modo:

@if(Request.IsAuthenticated) { 
<text>Signed In As <strong>@User().Identity.Name</strong> 

Personalmente, preferisco il primo approccio, ma ho pensato di fornire il secondo per un'opzione alternativa.

+2

'SharedViewPage' non implementa il membro astratto ereditato 'System.Web.WebPages.WebPageExecutingBase.Execute() –

3

La sintassi @ non fa riferimento ai valori in alcun modo, sta solo dicendo al motore di visualizzazione che stai iniziando un blocco di codice lato server.

Non c'è niente di "globale" su di esso. In questo caso, User è una proprietà nella classe astratta System.Web.WebPages.WebPageRenderingBase, che rappresenta is used by the view engine durante il rendering delle visualizzazioni come they inherit from it.

Suppongo che sia possibile estendere le classi WebViewPage o WebViewPage<> per aggiungervi proprietà. Ci può essere un modo migliore per ottenere quello che stai cercando di fare senza modificare quelli, però. Se stai cercando di passare i dati alla vista, i dati non dovrebbero far parte di ViewModel?

Idealmente si dovrebbe fornire tutto ciò che View ha bisogno in un ViewModel personalizzato e la vista erediterebbe da WebViewPage<CustomViewModel>.

Nella sintassi Razor Penso che ci si inizia il CSHTML con qualcosa di simile:

@model CustomViewModel 

allora si sarebbe proprietà di accesso su quel utilizzando la proprietà Model:

@Model.SomeProperty 
2

Si potrebbe probabilmente fare qualcosa di simile nella tua vista:

@Html.ViewContext.HttpContext.User.Identity.Name 

Vorrei raccomandare contro tuttavia, e aggiungere queste informazioni a un ViewModel.Per esempio:

public ActionResult SomeController() 
{ 
    var model = new MyViewModel 
    { 
     Username = User.Identity.Name 
    } 
    return View(model); 
} 

Ora all'interno della vista è possibile visualizzare queste informazioni:

@Model.Username 
2

O per un approccio meno invadente, e questo funziona per qualsiasi pagina Razor semplicemente il default:

@Context.User.Identity.IsAuthenticated 

Certo, è possibile impostare un alias variabile rapido se si desidera nella parte superiore del file Razor (_Layout o altro):

@{ 
    var User = Context.User; 
} 

ma in realtà inutile a meno che non si dispone di un oggetto custome IPrincipal in quel caso:

@{ 
    var User = (MyAuthenticatedUser)Context.User; 
} 

e che funziona ed è quello che uso :)

+0

Essendo nuovo nel Razor di ASP MVC, mi è saltato in mente che avrei potuto introdurre dinamicamente "globals" o oggetti personalizzati in una vista usando l'approccio semplice come quello che mostri nel tuo secondo esempio. Grazie! – nemesisfixx

Problemi correlati