2011-12-20 11 views
15

¿Cómo/Dónde puedo declarar un objeto como @User para que pueda ser referenciado globalmente en cualquier vista de afeitadora usando @?¿Cómo exponer objetos globales como @User en vistas de maquinillas de afeitar?

algo similar a:

_LoginPartial.cshtml:

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

pero en lugar de referencia mi objetivo:

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

¿Estás preguntando cómo hacer @user? ¿O estás preguntando cómo hacer @MyOwnObject? –

+0

Sí, @MyOwnObject. – JaJ

Respuesta

25

Puede cambiar el tipo de base de una página a una maquinilla de afeitar uno de su propio ejemplo:

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

Y a continuación, modificar el archivo de configuración de este 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 tiene una muy buena blog post on this here.

Como alternativa, puede agregar un método de extensión al System.Web.Mvc.WebViewPage (el tipo de base para páginas de hoja de afeitar) y usar esto.

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

Lo que sería utilizable como tal:

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

Personalmente, prefiero el primer enfoque, pero pensé en proporcionar la segunda a una opción alternativa.

+2

'SharedViewPage' no implementa el miembro abstracto heredado 'System.Web.WebPages.WebPageExecutingBase.Execute() –

3

La sintaxis @ no hace referencia a los valores de ninguna manera, solo le dice al motor de vista que está comenzando un bloque de código del lado del servidor.

No hay nada "global" al respecto. En este caso, User es una propiedad de la clase abstracta System.Web.WebPages.WebPageRenderingBase, que is used by the view engine al representar vistas como they inherit from it.

Supongo que puede ampliar las clases WebViewPage o WebViewPage<> para agregarles propiedades. Sin embargo, puede haber una forma mejor de lograr lo que estás tratando de hacer sin modificarlos. Si está tratando de pasar datos a la Vista, ¿no deberían esos datos ser parte de ViewModel?

Lo ideal es que suministre todo lo que necesita la vista en un modelo de vista personalizado y la vista heredará desde WebViewPage<CustomViewModel>.

En la sintaxis Razor Creo que sería comenzar el CSHTML con algo como:

@model CustomViewModel 

Entonces será propiedades de acceso en la que el uso de la propiedad Model:

@Model.SomeProperty 
2

Probablemente se podría hacer algo como esto en su Vista:

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

Yo recomendaría en contra de eso sin embargo, y agregue esta información a un ViewModel.Por ejemplo:

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

Ahora dentro de la vista se puede mostrar esta información:

@Model.Username 
2

O para un enfoque menos molesta, y esto funciona para cualquier página de la maquinilla de afeitar simplemente el valor por defecto:

@Context.User.Identity.IsAuthenticated 

Claro que podría configurar un alias variable rápido si lo desea en la parte superior de su archivo Razor (_Layout o de lo contrario):

@{ 
    var User = Context.User; 
} 

pero realmente innecesario a menos que tenga un objeto de atención al cliente al IPrincipal en ese caso:

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

y que funciona y es lo que yo uso :)

+0

Siendo nuevo en el Razor de ASP MVC, me había salteado la idea de que podía introducir dinámicamente "globales" o objetos personalizados en una vista usando el enfoque simple como lo que muestra en su segundo ejemplo. ¡Gracias! – nemesisfixx

Cuestiones relacionadas