2010-12-14 15 views
7

¡Estoy atascado! Tengo la impresión de que el archivo _layout.cshtml se usa para contenido similar a MasterPage. Todo lo que se muestra en cada página. Naturalmente, quiero escribir el código para renderizar el menú de mi barra lateral en ese archivo.¿Puede un controlador influir en el archivo _layout.cshtml?

Quiero mostrar dinámicamente una lista de categorías de mi base de datos, pero tengo un problema al pasar el modelo de categorías actual a Layout.cshtml ya que parece que ningún controlador realmente lo toca.

¿Alguna sugerencia?

De lo contrario, por favor dígame cómo abordar este problema. He estado atormentando mi cerebro durante los últimos tres días y todavía no hay una solución elegante.

necesito:

  1. fetch dinámicamente una lista de categorías de la base de datos.
  2. Muestre esta lista de categorías en cada vista. (De ahí el uso de _layout.cshtml)
  3. Maneja con elegancia cada categoría diferente, haz clic.

Estoy en mi ingenio final. : P ¿Cómo resolvería esto ?

+3

Ha hecho una serie de preguntas relacionadas con esto durante los últimos días, y se han proporcionado varias soluciones, incluida una o una combinación de 1) RenderPartial 2) RenderAction 3) ViewData 4) Filtro de acción global, etc. ¿Has probado alguno de ellos y cómo no cumplen con tus requisitos? – marcind

+0

Se reduce al archivo layout.cshtml que no puede utilizar el modelo pasado porque ningún controlador actúa sobre él. Sugerencias? –

+1

@Serg, RenderAction? – jfar

Respuesta

1

Cualquier modelo de vista que pase a su vista está automáticamente disponible dentro de su página maestra. Si no usa RenderAction/Action, que es el mejor enfoque, debe crear los datos de página maestra necesarios en cada acción y agregarlos a viewdata, ya sea mediante una clase base común para su modelo de vista fuertemente tipado que contenga todos los datos de la página maestra o usando el diccionario viewdata.

Sin embargo, le recomendaría encarecidamente que utilice el enfoque html.action. De esta manera, tiene una acción de controlador totalmente separada para tratar con su lista de categorías. Esta acción puede recuperar los datos de la categoría necesaria y devolver el usercontrol de la lista de categorías como una vista parcial y no tendrá que preocuparse por contaminar todas sus otras acciones con estos datos.

+0

¿Podría ampliar lo que quiere decir con 'html.action'? Cualquier página web/información sobre qué implica esto exactamente? – thecoop

+1

Esta es una buena introducción: http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-render-action –

0

He logrado algo similar al tener mis ViewModels implementar una interfaz que tiene miembros que contienen los datos del menú. En mi método de acción, configuro esa información. Luego, en mi punto de vista puedo comprobar para ver si mi vista-modelo que implementa inteface, tirar de los datos de menú a cabo y hacer que el menú (en una vista parcial en realidad)

1

Tal como lo veo, ViewData (y sus parientes como ViewBag, modelo, etc.) es para el vista actual específica. Su _Layout.cshtml no es específico de la vista actual; y sería incómodo si CADA controlador tuviera que pasar los datos de las categorías además de cualquier otra información que necesita pasar para la vista.

En cambio, lo que hago, es proporcionar un método estático en una de mis clases de ayuda que recupera las categorías de la base de datos. También hago un poco de almacenamiento en caché allí, para no tener que pegarle al DB en cada solicitud. El _Layout.cshtml simplemente llama a este método estático. Simple y elegante.

Si lo desea, puede llevar esto a una vista parcial, convertirlo en un método de ayuda, lo que sea.

Sin embargo, una nota de precaución: mi vista de error personalizada también usa el mismo _Layout.cshtml, y si el DB se cae, se obtiene una excepción al tratar de mostrar la excepción. ASP.NET MVC es lo suficientemente inteligente como para detectar esto y abortar el procesamiento, pero le queda una página de error predeterminada no descriptiva. Lo que hice fue colocar declaraciones try...catch alrededor de estas llamadas peligrosas, que silenciosamente ignoran la excepción si la página actual es la vista de error.

Cuestiones relacionadas