2010-06-24 21 views
5

¿Puede alguien explicar por qué definiría ViewData ["MenuData"] en cada acción para algo así como un menú dinámico?ASP.NET MVC, vistas parciales y datos

Tengo una vista parcial simple que representa un menú, renderizo este menú desde una página maestra. Esto es interesante para mí desde ASP.NET WebForms, pero la única manera de llenar el menú es pasar ViewData ["MenuData"], pero luego tengo que hacer esto en cada acción del controlador. Se siente un poco estúpido, que tendría que definir esta vista de datos cada vez.

En cuanto a la capacidad de prueba y lo que es ASP.NET MVC-ish, ¿cómo debería abordar esto?

Respuesta

4

Otra opción es utilizar el método RenderAction lugar que será llame una acción (en el controlador actual, o si también proporciona un nombre de controlador, ese controlador), que luego puede generar los datos del menú para usted, y llame a su vista parcial ascx:

Así que en mi página maestra Puedo tener:

<% Html.RenderAction("MenuArchiveList"); %> 

Luego, en mi regulador:

public ActionResult MenuArchiveList() { 
    return PartialView("BlogArchiveList", 
        _BlogRepository.GetArchiveYearPostCounts()); 
} 

Esto entonces detecta correctamente el control de usuario \Views\Shared\BlogArchiveList.ascx

Si desea asegurarse de que su acción sólo se llamó nunca en el contexto de una visión parcial , entonces debes decorarlo con el ChildActionOnlyAttribute.

Esto se agregó a System.Web.Mvc en la versión 2 del espacio de nombres "futuros" Microsoft.Web.Mvc.

+0

Eso es todo. Gracias. –

+0

No hay problema, es un placer. –

0

Debe utilizar un controlador de base que se encarga de la población repetida de su modelo de vista y luego tener todos los controladores se derivan de ella

ver aquí ViewModel Best Practices

Cuestiones relacionadas