Pregunta

Estoy intentando crear un menú para mi sitio web.Debe cumplir con los siguientes requisitos.

  • debe estar controlado por una base de datos, extrayendo datos de la base de datos para construir la estructura del menú
  • los datos que se extraen de la base de datos deben almacenarse en caché; no quiero acceder a la base de datos para cada solicitud de página

Por el momento, tengo un ejemplo simplista en ejecución, pero no sé cómo integrar el almacenamiento en caché.Creo que tendré que reelaborar toda la forma en que hago esto.Aquí lo tienes:

tengo un ProductoMenúAtributo, que extrae los datos de la base de datos y los almacena en ViewData:

public class ProductMenuAttribute: FilterAttribute, IActionFilter
{
    #region IActionFilter Members

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext != null)
        {
            var context = filterContext.Result as ViewResult;
            if (context != null)
            {
                ProductsRepository repository = new ProductsRepository(Properties.Settings.Default.SqlConnectionString);

                context.ViewData.Add("ProductsList", repository.GetAllProductRanges());
            }
        }
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {

    }

    #endregion
}

En mi Sitio.master Saco los datos del Ver datos y usarlo para renderizar mi menú.Este es un pequeño fragmento de mi lista de menú desordenada, al que se le aplica estilo usando CSS.Aquí está el código:

            <li>
                <%= Html.ActionLink("Products", "Index", "Products")%>

                <%  IQueryable<ProductRange> productRanges = ViewData["ProductsList"] as IQueryable<ProductRange>; %>

                    <% if (productRanges != null)
                       { %>

                    <ul>
                        <% foreach (ProductRange range in productRanges) 
                           { %>   
                            <li><%= Html.ActionLink(range.Name, "RangeDetails", "Products", new { id = range.ID }, null)%></li>
                        <% } %>
                    </ul>

                    <% } %>
            </li>

Luego decoro cada controlador con el [MenúProducto] atribuir de la siguiente manera:

[ProductMenu]
public class HomeController : BaseController
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

Ahora, cada vez que se realiza alguna de las acciones en mi controlador, el En acción ejecutada método en el ProductoMenúAtributo Se llamará a la clase, que establecerá ViewData, que eventualmente se usará en mi Sitio.Master para construir mi menú desde la base de datos, momento en el que llamo a cualquiera de las acciones.

El problema ahora es: ¿cómo agrego el almacenamiento en caché a este escenario?No tengo idea de por dónde empezar y tengo la sensación de que la solución que tengo no se puede almacenar en caché.

¿Fue útil?

Solución

Creo que lo que busco realmente es utilizar el Html.RenderAction () Extensiones de ayudante del proyecto MVC futuros.

La idea es utilizar lo anterior para llamar a una acción en un controlador, que va a generar la estructura de menús HTML tirando de datos de la BD. Entonces también uso sencillo caché de resultados para almacenar en caché los datos durante unos minutos ..

Este es el método más sencillo que he encontrado hasta ahora para conseguir lo que quiero.

EDIT: Phil Haack escribió en su blog acerca de esto últimamente - Html.RenderAction y Html.Action . Una gran entrada de blog que cubre todas mis necesidades exactas, con explicaciones de todas las cuestiones.

Para obtener el almacenamiento en caché para que funcione correctamente, que tendría que poner mi llamada Html.RenderAction() dentro de un ViewUserControl con el conjunto Directiva OutPutCaching de la siguiente manera:

<@ OutputCache Duration="100" VaryByParam="None" %>

a continuación, llamar a la anterior con Html.RenderPartial(), y listo, funciona todo!

Otros consejos

Puede modificar su repositorio de ser conscientes de caché: Ver estas dos preguntas: caché repositorio y http caché .

he hecho esto mediante el uso de bloques Enterprise Library Almacenamiento en caché. Comprobar si hay datos en caché, si hay datos en caché, se crea cadena HTML a partir de datos en su base de datos y ponerlo en la memoria caché de modo más adelante en la búsqueda de datos en caché se puede encadenar llanura simplemente de salida: D

Sólo para mencionar que el código para hacer que estaba en la clase estática. Enfermos ejemplo puesto, pero estoy reescribiendo esa aplicación en MVC2 desde cero, así que no tengo código a mano.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top