2011-02-01 5 views
7

Estoy luchando con lo que parece ser un concepto muy simple. Si tengo un valor en ViewBag destinado a mi _Layout.cshtml, ¿cómo y dónde puedo establecer ese valor?Enfoques para el manejo de datos comunes en ASP.NET MVC 3 vistas

Éstos son los más evidentes (para mí) opciones como actualmente los veo:

  1. Establecer el valor de cada controlador (no DRY)
  2. crear mi propia base de control que hereda de Controller y establezca el valor de la clase
  3. de base Establecer el valor en Global.asax.cs (siente sucio)
  4. Crear ActionFilter para establecer los datos y registrar el filtro a nivel mundial (también se siente mal)
  5. establecer el valor en _ViewStart.cshtml (se siente muy mal y muy sucio)

Por ejemplo:

_Layout.cshtml


<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>@ViewBag.Title</title> 
</head> 
<body> 
    <div id="header"> 
     <h1>Welcome @ViewBag.UserName</h2> 
    </div> 
    <div id="content"> 
     @RenderBody() 
    </div> 
</body> 
</html> 

Si cada controlador establece el valor Nombre de usuario, que no es terriblemente SECO. Si estuviera abordando esto con algo como CodeIgniter, solo crearía mi propio controlador base para manejar estos elementos comunes y seguir mi camino feliz. ¿Hay una opción más preferida con ASP.NET MVC 3?

+0

Bueno, en realidad, en este caso particular, estoy adivinando "Nombre de usuario" en realidad vendría de la sesión/formularios de entrada de autenticación. Así que es posible que desee utilizar un ayudante de HTML que utiliza el código de FormsAuth para extraer el nombre de usuario de la cookie y procesar un MvcHtmlString, solo un pensamiento ... – RPM1984

+0

Hmmm ... buen punto. Tal vez @ ViewBag.UserName no es el mejor ejemplo. Sin embargo, estoy realmente más preocupado por el panorama general en este momento. – Greg

+0

@ RPM1984: no debería importar a la vista que el "Nombre de usuario" proviene de la autenticación de formulario. Se debe pasar en (ViewBag o de otro modo). La vista nunca debe "buscar" nada. Considere probar escenarios también, quiere pasar datos falsos a la vista para probar la unidad. No es posible si su vista está "buscando" cosas. También invalida el punto general del patrón MVC. No te estoy molestando, pero acabo de ver este tipo de mentalidad repetida en varios artículos de MVC (¡incluida la plantilla de proyecto MVC predeterminada!) – Roger

Respuesta

10

El modelo de vista común y el controlador base es el camino a seguir IMO. Use un modelo de vista común como la clase base para todos sus modelos de vista. Utilice el método OnActionExecuted en el controlador base para obtener el modelo de vista (para una acción que devuelve una vista) y emitirlo al modelo de vista común. Establezca las propiedades comunes en ese momento.

+0

Groovy. Me alegra saber que no estoy completamente fuera de la base. – Greg

+1

Solo conozco el trato Sith en términos absolutos, pero esta es la única respuesta correcta. La vista solo debe leerse desde el modelo, y solo el controlador puede escribir en el modelo. Si se apega a los modelos robustos, querrá un modelo base y un controlador base. – Roger

+1

@tvanfossen. Este es un enfoque interesante y estoy actualmente probando. Una pregunta: ¿Puedo usar un ActionFilter en lugar de un controlador base y engancharme en 'OnActionExecuted'? Necesito pasar datos comunes, pero solo sobre acciones específicas, por lo que sería mejor decoratin en aquellos con un filtro. –

0

Digamos que quiero que ViewBag.PageHeight tenga un valor predeterminado de 1000 para todas las páginas, pero luego permita que sea reemplazado por cualquier página/vista. Esto es lo que puse en _Layout.cshtml:

La altura de la página es @ (ViewBag.PageHeight? 1000)

Esto parece funcionar.

Cuestiones relacionadas