Frage

Ich bin versucht, erstellen Sie ein Menü für meine website.Es muss die folgenden Anforderungen erfüllen

  • es muss datenbankbasierte, abrufen von Daten von DB-Aufbau der Menü-Struktur
  • die Daten gezogen von der DB muss zwischengespeichert werden - ich will nicht zu schlagen, die DB für jede Anforderung der Seite

Im moment habe ich ein stark Vereinfachtes Beispiel laufen, aber ich weiß nicht, wie Sie zu integrieren caching.Ich glaube ich habe zu überarbeiten die gesamte Art, wie ich dies tun.Hier ist es:

Ich habe eine ProductMenuAttribute, die zieht die Daten aus der DB und speichert Sie in der 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
}

In meinem Website.master Ich ziehe die Daten aus der ViewData und verwenden Sie es, um meinen Menü.Dies ist ein kleiner Ausschnitt in meinem un-geordnete Menü Liste, die wird mithilfe von CSS gestaltet.Hier ist der code:

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

Ich habe dann schmücken jeden controller mit dem [ProductMenu] attribuate wie folgt:

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

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

Nun, wenn alle Aktionen auf meinem controller getroffen werden, die OnActionExecuted Methode in der ProductMenuAttribute Klasse aufgerufen werden, in dem die ViewData, die schließlich verwendet werden auf meine Website.Master aufzubauen mein Menü von der DB, die Zeit, die ich aufrufen von Aktionen.

Jetzt ist das problem - wie füge ich caching, um dieses Szenario??Ich habe keine Ahnung, wo Sie anfangen sollen, und haben ein Gefühl der Lösung, die ich habe, ist nicht zwischengespeichert werden.

War es hilfreich?

Lösung

Ich denke, was ich wirklich Suche, ist die Verwendung der Html.RenderAction() helper Erweiterung des MVC Futures-Projekt.

Die Idee ist, um die oben zu rufen Sie eine Aktion auf einem controller, die werden erzeugen die HTML-Menü-Struktur, indem Sie Daten aus der DB.Ich habe dann auch einfache Ausgabe-Caching Zwischenspeichern von Daten für ein paar Minuten..

Dies ist der einfachste Ansatz, den ich bisher gefunden habe, was ich erreichen will.

EDIT: Phil Haack schrieb einen Artikel über das kürzlich Html.RenderAction und Html.Aktion.Einen tollen blog-post über alle meine Bedürfnisse, mit Erklärungen zu allen Themen.

Um die caching, um korrekt zu arbeiten, die ich brauchen würde, um meine Html.RenderAction() rufen Sie innen einen ViewUserControl mit der OutputCaching Richtlinie, die wie folgt festgelegt:

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

Ich nenne das dann oben mit Html.RenderPartial(), und voila, es funktioniert alles!

Andere Tipps

Können Sie ändern Ihre repository-cache-aware:Sehen diese zwei Fragen:Cache-repository und http-cache.

Ich habe das getan, indem Sie mit Enterprise Library Caching-block.Überprüfen Sie zwischengespeicherte Daten, wenn es keine Cache-Daten, erstellen Sie html-Zeichenfolge aus Daten in Ihrer Datenbank und stellen Sie es im cache, so dass später bei der Suche nach zwischengespeicherten Daten Sie können nur Ausgang plain string :D

Nur um zu erwähnen, dass code, dies zu tun, war in der statischen Klasse.Ill post Beispiel, aber ich bin umzuschreiben, dass app in MVC2 from scratch, so i dont haben zu code von hand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top