2016-12-21 2 views
3

Ich benutze CachedPartial HTML-Helfer, die diese Teilansicht zwischenspeichert.Cache Teilansicht mit Umbraco CachedPartial für verschiedene Modell

@Html.CachedPartial("PartialView", MyModel, 3600, true); 

Aus meiner Sicht habe ich die folgende Situation:

@Html.CachedPartial("PartialView", MyModel, 3600, true); 

@Html.CachedPartial("AnotherPartialView", MyModel1, 3600, true); 

@Html.CachedPartial("PartialView", MyModel3, 3600, true); // I want to reuse partial view 

Es scheint, dass erste und dritte Ansicht ist identisch wegen CachedPartial ...

Wie durch Modellparameter teilweise im Cache machen ?

Ich versuchte

@Html.CachedPartial("PartialView", MyModel, 3600, true, false, new ViewDataDictionary(MyModel3)); 

aber gleiche Sache zu verwenden.


bearbeiten: habe ich einen anderen Ansatz als DZL und es funktioniert

public static IHtmlString CachedPartial(this HtmlHelper helper, string partialViewName, object model, string cacheKey = null) 
    { 
    if (string.IsNullOrWhiteSpace(cacheKey)) { 
     return helper.CachedPartial(partialViewName, model, AppSettings.PartialCachingSeconds, true); 
    } 

    Func<object, ViewDataDictionary, string> fc = (o, v) => cacheKey; 

    return helper.CachedPartial(partialViewName, model, AppSettings.PartialCachingSeconds, true, contextualKeyBuilder: fc); 
    } 

und dann

@Html.CachedPartial("PartialView", MyModel, "a_key"); 

@Html.CachedPartial("AnotherPartialView", MyModel1); 

@Html.CachedPartial("PartialView", MyModel3, "another_key"); // I want to reuse partial view 

Antwort

3

Wenn Sie möchten, dass Sie Ihre eigene Implementierung erstellen müssen CachedPartial, etwas wie dieses:

using System; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 
using Umbraco.Web; 
using System.Web; 
using System.Runtime.Caching; 

public static class CachedPartialExtensions 
{ 
    public static IHtmlString MyCachedPartial(
     this HtmlHelper htmlHelper, 
     string partialViewName, 
     object model, 
     int cachedSeconds, 
     bool cacheByPage = false, 
     string cacheKey = null, 
     ViewDataDictionary viewData = null 
    ) 
    { 
     var newCacheKey = "fpc-"; //prefix to know which keys to clear on page publish (in Bootstraper.cs file) 
     newCacheKey += partialViewName; 
     if (cacheByPage) 
     { 
      newCacheKey += "page-" + UmbracoContext.Current.PageId; 
     } 
     if (!string.IsNullOrEmpty(cacheKey)) 
     { 
      newCacheKey += "key-" + cacheKey; 
     } 

     var result = MemoryCache.Default.Get(newCacheKey) as MvcHtmlString; 
     if(result == null) 
     { 
      result = htmlHelper.Partial(partialViewName, model, viewData); 
      MemoryCache.Default.Add(new CacheItem(newCacheKey, result), new CacheItemPolicy 
      { 
       AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(cachedSeconds) 
      }); 
     } 

     return result; 
    } 
} 

Und dann werden Sie in der Lage sein, Ihre eigenen Schlüssel für den Cache zur Verfügung zu stellen:

@Html.MyCachedPartial("PartialView", Model, 60, cacheKey: "model1key", cacheByPage: true) 
@Html.MyCachedPartial("PartialView", Model2, 60, cacheKey: "model2key", cacheByPage: true) 

EDIT:

Ab Version 7 gibt es eine Überlastung für CachedPartial, dass der Schlüssel in

übergeben werden kann
public static IHtmlString CachedPartial(
    this HtmlHelper htmlHelper, 
    string partialViewName, 
    object model, 
    int cachedSeconds, 
    bool cacheByPage = false, 
    bool cacheByMember = false, 
    ViewDataDictionary viewData = null, 
    Func<object, ViewDataDictionary, string> contextualKeyBuilder = null); 

Der Anwendungsfall dafür wäre:

@Html.CachedPartial(
    "PartialView", 
    MyModel3, 
    3600, 
    cacheByPage: true, 
    contextualKeyBuilder: (model, viewData) => 
    { 
     return (model as MyViewModel).Id.ToString(); 
    }); 
+0

Danke für die Idee, siehe meinen bearbeiteten Post :) –

+1

@SnakeEyes toll - das funktioniert für Version 7+. Wenn Sie diesen Ansatz verwenden möchten, ist keine Erweiterungsmethode erforderlich, sie kann direkt geschrieben werden, siehe meine bearbeitete Antwort - wenn Sie es vereinfachen möchten :) –

Verwandte Themen