2010-10-27 13 views
7

Por lo tanto, si hay algún estado global que cada vista de una aplicación MVC deba representar ... por ejemplo: IsUserLoggedOn y UserName ... ¿Cuál es la forma adecuada de obtener esa información en cada vista?ASP.NET MVC: ¿Cómo manejar los datos del modelo que deben ir a cada vista?

Entiendo que esa parte de la vista debe estar en la página maestra o en una vista parcial que se agrega a las otras vistas. ¿Pero cuál es una buena manera de asegurarse de que los datos del modelo "global" se pasen a la vista cada vez desde todos los controladores y acciones relevantes?

Respuesta

6

Después de preguntar esto, me encontré con esta buena entrada en el blog de Steve Sanderson : http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/

Sugiere tres diferentes enfoques:

  • utilizar una clase de controlador de base o ActionFilter añadir el modelo correspondiente a la colección ViewData[] cada vez. Creo que algunas personas ya han sugerido ese tipo de cosas.

  • Uso Html.RenderAction() en la vista ... y como él dice:

Si alguien le dice que internos subpeticiones son malos porque que “no es MVC”, a continuación, sólo morder ellos en la cara inmediatamente. También pregunte por qué todavía están dispuestos a utilizar Ajax, e incluso <IMG> etiquetas para el caso, dado que ambos son una forma de 0-subpetición.

  • Use 'Solicitudes parcial' (que proporciona el código para esto en his blog) que permiten que un controlador a nido llama a otros controladores en un ViewData estructura sortof anidada.
+0

+1 RenderAction es el camino a seguir. Mantiene un buen SRP – redsquare

3

codeulike - ver la respuesta a una pregunta similar preguntado exactamente al mismo tiempo que el presente:

ASP.NET MVC displaying user name from a Profile

en pocas palabras, básicamente crear un controlador de base que ha heredado por todos los otros controladores. el controlador base tiene una función de anulación que transporta a todos los controladores 'hijos'. en lugar de duplicar el código, echar un vistazo a mi respuesta anterior y darle una oportunidad ..

aplausos ...

2

podría crear clase base de modelo de vista que contiene la información compartida y heredar que para cada modelo de vista.

public class ViewModelBase 
{ 
    // shared data 
} 
public class Page1ViewModel : ViewModelBase 
{ 
    // page 1 data 
} 

En masterpage podría utilizar esa clase base

Inherits="System.Web.Mvc.ViewMasterPage<ViewModelBase>" 

y en cada vista usar esas clases derivadas

Inherits="System.Web.Mvc.ViewPage<Page1ViewModel>" 
+0

Correcto, pero ¿cómo puedo completar ese modelo de vista cada vez? Presumiblemente con un controlador base, ¿verdad? – codeulike

+0

ViewModelBase constructor/helper class/controller clase base –

Cuestiones relacionadas