2011-03-05 15 views
10

Necesitamos datos dinámicos pasados ​​a nuestro archivo de diseño, sin importar cuál sea la vista secundaria. Por ejemplo, mostramos algunos datos específicos del usuario en el encabezado del diseño.Diseño de ASP.NET MVC 3 Datos ViewBag en todas las vistas secundarias

¿Cómo podemos pasar esta información a la vista de disposición sin que cada acción tenga que proporcionarla de manera independiente? ¿Deberíamos usar un controlador personalizado o hay una mejor solución?

+0

Si está utilizando la COI, esto es un blog que escribí no hace mucho tiempo que muestra una aproximación única: http://crazorsharp.blogspot.com /2011/03/master-page-model-in-aspnet-mvc-3-using.html – BFree

Respuesta

9

La estrategia que utilizo es tener un modelo de vista de base a partir del cual se derivan todos mis modelos de vista. Utilizo un controlador base, aunque también podría usar un filtro global y anular OnActionExecuted. Cuando detecto una acción que devuelve un ViewResult, echo el modelo a mi modelo de vista base y establezco las propiedades comunes en el modelo desde el controlador base.

La elección entre un filtro global y un controlador base depende de una variedad de factores. Si realmente se aplica a todas las acciones (que devuelven los resultados de la vista) y no necesita inyección para acceder a algunos recursos, entonces probablemente vaya con el filtro. Si necesita tener dependencias inyectadas o si tiene algunos controladores donde los datos se aplicarían y otros donde no (por ejemplo, el controlador de administración), iría a la ruta del controlador base. Deberá recordar derivar del controlador si lo acepta.

También podría hacer lo mismo con la ViewBag si no desea derivar de un modelo de vista común. Me gusta tener el modelo fuertemente tipado, pero YMMV.

+0

¿Puede proporcionar algún enlace al código que hace esto? Soy muy nuevo en esto y entiendo tu respuesta, pero sin una pista de cómo implementar esto. –

2

Eche un vistazo a los controles de inicio de sesión que son estándar en un proyecto Razor - estas vistas parciales acceden a los datos del usuario - probablemente exactamente como usted quisiera.

p. Ej. LogonPartial.cshtml un típico podría contener:

@if(Request.IsAuthenticated) { 
    <text>Welcome <b>@Context.User.Identity.Name</b>! 
    [ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text> 
} 
else { 
    @:[ @Html.ActionLink("Log On", "LogOn", "Account") ] 
} 
+1

¿Qué pasaría si tuviéramos que acceder a datos que no son del usuario y que no estarían disponibles por defecto desde el contexto? –

Cuestiones relacionadas