Question

Je suis en train de créer un menu pour mon site web.Il doit répondre aux exigences suivantes

  • il doit être piloté par base de données, extraction de données à partir de DB pour construire la structure de menu
  • les données extraites de la DB doit être mis en cache, je ne veux pas de frapper la DB pour chaque demande de page

Pour le moment, j'ai un exemple simpliste de l'exécution, mais je ne sais pas comment intégrer la mise en cache.Je pense que je pourrais avoir à retravailler l'ensemble de la façon dont je le fais.Ici, il est:

J'ai un ProductMenuAttribute, qui extrait les données de la DB, et la stocke dans la 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
}

Dans mon Site.maître Je tire les données de la ViewData et de l'utiliser pour le rendu de mon menu.C'est un petit extrait de mon non-ordonnée de la liste de menu, qui est de style à l'aide de CSS.Voici le 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>

J'ai ensuite décorer chaque contrôleur avec l' [ProductMenu] attribuée comme suit:

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

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

Maintenant, chaque fois que l'une des actions sur mon contrôleur sont touchés, l' OnActionExecuted méthode dans le ProductMenuAttribute classe sera appelée, sur lequel sera fixé le ViewData, qui finira par être utilisé sur mon Site.Maître pour construire mon menu de la DB, j'en appel de l'un quelconque des actes.

Le problème maintenant est - comment puis-je ajouter de la mise en cache de ce scénario??Je n'ai aucune idée par où commencer, et ont un sentiment de la solution que j'ai est pas mis en cache.

Était-ce utile?

La solution

Je crois que ce que je suis à la recherche de l'utilisation de la Html.RenderAction() helper extension de la MVC Futures du projet.

L'idée est d'utiliser ce qui précède pour appeler une action sur un contrôleur, ce qui va générer le code HTML du menu structure par extraction de données de la DB.Je puis également utiliser simple mise en Cache de Sortie pour les données en cache pour quelques minutes..

C'est l'approche la plus simple que j'ai trouvé à ce jour pour atteindre ce que je veux.

EDIT: Phil Haack blogué sur cette récemment Html.RenderAction et Html.Action.Un billet de blog très couvrant tous mes besoins, avec des explications sur toutes les questions.

Pour obtenir la mise en cache fonctionne correctement, j'aurais besoin de mettre mon Html.RenderAction() appel à l'intérieur d'un ViewUserControl avec le OutputCaching directive définie comme suit:

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

Je téléphone alors à la ci-dessus avec Html.RenderPartial(), et voilà , tout fonctionne!

Autres conseils

Vous pouvez modifier votre référentiel d'être cache-connaissance:Voir ces deux questions:cache référentiel et le cache http.

Je l'ai fait en utilisant Entreprise de la Bibliothèque de la mise en Cache de bloc.Vous recherchez des données mises en cache, si il n'y a pas de mise en cache de données, vous créez la chaîne html à partir des données de votre base de données et le mettre en cache plus tard, lors de la recherche de données mises en cache, vous pouvez juste sortie de la plaine de la chaîne :D

Juste pour mentionner que le code pour le faire était en classe statique.Mauvais exemple post mais je suis la réécriture de l'application dans MVC2 à partir de zéro, donc je n'ai pas de code à la main.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top