2011-12-20 26 views
15

W jaki sposób/gdzie mogę zadeklarować obiekt taki jak @User, aby można go było odnosić globalnie w dowolnym widoku maszynki za pomocą @?Jak odsłonić obiekt globalny, taki jak @User w widoku brzytwy?

coś podobnego do:

_LoginPartial.cshtml:

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

ale zamiast odwoływać mojego obiektu:

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

Pytasz jak to zrobić @User? A może pytasz, jak to zrobić @MyOwnObject? –

+0

Tak, @MyOwnObject. – JaJ

Odpowiedz

25

Można zmienić typ bazowy strony Razor do jednego z własne np .:

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

a następnie zmodyfikować plik konfiguracyjny tak:

<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 ma bardzo dobrą blog post on this here.

Można również dodać metodę rozszerzenia do System.Web.Mvc.WebViewPage (typ podstawowy dla stron maszynki do golenia) i użyć tej opcji.

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

Który byłby użyteczny tak:

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

Osobiście wolę pierwsze podejście, ale pomyślałem, że dostarczają drugi alternatywnej opcji.

+2

'SharedViewPage' nie implementuje odziedziczonego abstrakcyjnego elementu 'System.Web.WebPages.WebPageExecutingBase.Execute() –

3

Składnia nie odwołuje się do wartości w jakikolwiek sposób, tylko mówi silnikowi widokowemu, że zaczynasz blok kodu po stronie serwera.

Nie ma w tym nic "globalnego". W tym przypadku User jest właściwością klasy abstrakcyjnej System.Web.WebPages.WebPageRenderingBase, która is used by the view engine podczas renderowania widoków jako they inherit from it.

Przypuszczam, że można rozszerzyć klasy WebViewPage lub WebViewPage<>, aby dodać do nich właściwości. Być może istnieje lepszy sposób na osiągnięcie tego, co próbujesz zrobić bez modyfikowania ich. Jeśli próbujesz przekazać dane do widoku, czy te dane nie powinny być częścią ViewModel?

Najlepiej byłoby dostarczyć wszystko, czego potrzebuje View w niestandardowym ViewModelu, a Widok dziedziczy po WebViewPage<CustomViewModel>.

W składni Razor myślę chcesz rozpocząć CSHTML z czymś takim:

@model CustomViewModel 

Wtedy bym właściwości dostępu na tym za pomocą właściwości Model:

@Model.SomeProperty 
2

Prawdopodobnie mógłby zrobić coś takiego w Twoim widoku:

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

Polecam przeciw temu jednak i dodaj tę informację do ViewModel.Na przykład:

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

Teraz wewnątrz widoku można wyświetlać następujące informacje:

@Model.Username 
2

lub dla mniej natrętny podejścia, a to działa na każdej stronie Razor po prostu domyślnie:

@Context.User.Identity.IsAuthenticated 

Na pewno możesz ustawić alias szybkiej zmiennej, jeśli chcesz na górze pliku Razor (_Layout lub w inny sposób):

@{ 
    var User = Context.User; 
} 

ale naprawdę zbędne, chyba że masz custome IPrincipal obiekt w tym przypadku:

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

i że działa i to co używam :)

+0

Będąc nowicjuszem w Brzytwach ASP MVC, trochę zapomniałem o tym, że mogłem dynamicznie wprowadzić "globale" lub niestandardowe obiekty do widok za pomocą prostego podejścia, takiego jak to, co pokazujesz w swoim drugim przykładzie. Dzięki! – nemesisfixx

Powiązane problemy