Domanda

Sto cercando di creare un menu per il mio sito web.Deve soddisfare i seguenti requisiti

  • deve essere gestito da un database, estraendo i dati dal DB per costruire la struttura del menu
  • i dati estratti dal DB devono essere memorizzati nella cache: non voglio colpire il DB per ogni richiesta di pagina

Al momento ho un esempio semplicistico in esecuzione, ma non so come integrare la memorizzazione nella cache.Penso che potrei dover rielaborare l'intero modo in cui lo faccio.Ecco qui:

Ho un Attributo menu prodotto, che estrae i dati dal DB e li memorizza in 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
}

Nel mio Sito.master Prendo i dati da Visualizza dati e usarlo per visualizzare il mio menu.Questo è un piccolo frammento nel mio elenco di menu non ordinato, a cui viene applicato uno stile utilizzando i CSS.Ecco il codice:

            <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>

Quindi decoro ciascun controller con il [Menu Prodotto] attribuire come segue:

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

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

Ora ogni volta che viene eseguita una qualsiasi delle azioni sul mio controller, il file OnActionExecuted metodo nel Attributo menu prodotto verrà chiamata la classe, che imposterà il ViewData, che eventualmente verrà utilizzato sul my Sito.Master per creare il mio menu dal DB, momento in cui chiamo una qualsiasi delle azioni.

Il problema ora è: come posso aggiungere la memorizzazione nella cache a questo scenario??Non ho idea da dove cominciare e ho la sensazione che la soluzione che ho non sia memorizzabile nella cache.

È stato utile?

Soluzione

Penso che quello che sto veramente cercando sia usare il file Html.RenderAction() estensione helper dal progetto MVC Futures.

L'idea è di utilizzare quanto sopra per richiamare un'azione su un controller, che genererà la struttura del menu HTML estraendo i dati dal DB.Quindi utilizzo anche la semplice memorizzazione nella cache di output per memorizzare nella cache i dati per alcuni minuti.

Questo è l'approccio più semplice che ho trovato finora per ottenere ciò che desidero.

MODIFICARE: Phil Haack ha scritto di recente su questo argomento: Html.RenderAction e Html.Action.Un ottimo post sul blog che copre tutte le mie precise esigenze, con spiegazioni di tutti i problemi.

Per far funzionare correttamente la memorizzazione nella cache, dovrei inserire il file my Html.RenderAction() chiama all'interno di a VisualizzaUserControl con la direttiva OutputCaching impostata come segue:

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

Quindi chiamo quanto sopra con Html.RenderPartial(), e voilà, funziona tutto!

Altri suggerimenti

Puoi modificare il tuo repository per riconoscere la cache:Vedi queste due domande:archivio memorizzato nella cache E cache http.

L'ho fatto utilizzando il blocco Enterprise Library Caching.Controlla i dati memorizzati nella cache, se non sono presenti dati memorizzati nella cache, crei una stringa html dai dati nel tuo database e la metti nella cache, quindi in seguito, quando cerchi i dati memorizzati nella cache, puoi semplicemente generare una stringa semplice: D

Solo per menzionare che il codice per farlo era nella classe statica.Pubblicherò un esempio ma sto riscrivendo l'app in MVC2 da zero, quindi non ho il codice a mano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top