2009-03-31 20 views
6

que estoy tratando de pasar a mi ViewData asp.net mvc masterpage para un control de usuario mvc que guardo en un masterpage. Por ejemplo, creé una lista desplegable de nombres como un control de usuario mvc y los puse en mi página maestra.viewdata que pasan a ASP.NET MVC masterpages

El problema con el que me estoy cruzando es pasar el ViewData a la página maestra. Encontré este artículo de Microsoft que tiene una solución decente pero me preguntaba si hay otras soluciones "mejores" que existen. Lo que no me gusta de la solución en el enlace es que tengo que cambiar cada controlador para que herede de una nueva clase de controlador.

http://www.asp.net/learn/MVC/tutorial-13-cs.aspx

Editar: El problema que estoy mirando es el hecho de que si pongo un control de usuario en mi masterpage que se basa en ViewData, tengo que REPETIDAMENTE incluyen que ViewData para cada página que usa dicha página maestra Es posible que la solución en el enlace de arriba sea la mejor solución, pero esperaba que hubiera otras alternativas.

Respuesta

1

Por lo que vale la pena, estoy usando el método de esa clase particular en un proyecto actual y funciona muy bien

Lo que también puede hacer, si los datos son algo estáticos (como un menú que no cambia mucho), es poner el objeto en la memoria caché para que no se solicite su base de datos para cada inicialización de controlador.

4

La página maestra ya tiene acceso a ViewData. Si desea escribió fuertemente el acceso a la misma, que tiene que hacer dos cosas:

  1. poner las cosas página maestra en una clase base (por ejemplo CommonViewData)
  2. ¿Ha dominar página heredan de la ViewMasterPage genérica <> clase:.

    "%>
+1

El problema que estoy viendo es el hecho de que si coloco un control de usuario en mi página maestra que se basa en ViewData, tengo que incluir ese ViewData para cada página que use dicha página maestra. – codette

0

yo no lo entiendo muy bien su problema ...

El problema que estoy mirando es el hecho de que si pongo un control de usuario en mi masterpage que se basa en ViewData, tengo que incluye REPETIDAMENTE ese ViewData para cada página que usa dicha página maestra.

Bueno, sí ... por supuesto que sí. Si tiene un control de usuario en su página maestra, entonces, por supuesto, tendrá que pasar los datos requeridos para ese control de usuario para cada acción & vista que utiliza esa página maestra.

No es como si tuviera que repetirse si solo hereda de un controlador base.

Es el problema el hecho de que algunos controladores tienen acciones que tanto hacen y no requieren puntos de vista que se derivan de que masterpage en particular? Por lo tanto, si está implementando un controlador base, las acciones que no usan esa página maestra particular todavía tendrán los datos de vista para ello ...? (Si todo lo que tiene sentido ;-)

+0

Todo el motivo por el que hago esta pregunta es para ver si hay alternativas a la solución provista en el enlace en mi pregunta original. Pero supongo que MS publicará la "mejor" solución que se le pueda ocurrir. – codette

2

Cómo es posible utilizar el método OnActionExecuting en una clase de controlador de base y rellenar los datos de vista allí?

Algo así como:

protected override void OnActionExecuting(ActionExecutingContext context) 
{ 
    context.Controller.ViewData.Model = GetDataForControl(); 
} 

no he probado lo que es sólo un pensamiento ...

1

que suelen utilizar una clase abstracta controlador para mi MasterPage, es la mejor solución, porque la página maestra es como una "vista abstracta". Pero anulo el método MasgerPageController View() para incluir viewdata.

protected override ViewResult View(string viewName, string masterName, object model) 
{ 
    this.ViewData["menu"] = this.PagesRepository.GetPublishPages(); 
    return base.View(viewName, masterName, model); 
} 
+0

Limpio y simple, gracias! Cuatro años más tarde y finalmente obtuvo un voto favorable;) – statue

0

Creo que la solución sugerida funciona pero no es la solución ideal. Si ponemos el código en el constructor de BaseController, se llamará incluso para los métodos de acción que no tengan una página maestra (por ejemplo, métodos de publicación y métodos de Ajax).
Creo que una mejor solución (no ideal) es llamar al método Html.Action en la página Master.

Cuestiones relacionadas