2016-12-21 8 views
3

Я использую CachedPartial html helper, который кэширует этот частичный вид.Частичный вид кеша с использованием Umbraco CachedPartial для другой модели

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

На мой взгляд, у меня следующая ситуация:

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

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

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

Кажется, что первый и третий вид тождественно из CachedPartial ...

Как сделать кэшируются парциальное параметром модели ?

Я пытался использовать

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

но то же самое.


Edit: Я использовал другой подход, чем DZL и он работает

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); 
    } 

, а затем

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

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

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

ответ

3

Если вы хотите, что вам нужно будет создать свою собственную реализацию CachedPartial, что-то вроде этого:

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

И тогда вы будете в состоянии обеспечить свои собственные ключи для кэша:

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

EDIT:

Начиная с версии 7 есть перегрузка для CachedPartial, что позволяет ключ, который будет принят в

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

прецедент для этого было бы:

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

Спасибо за идею, см. Мой отредактированный пост :) –

+1

@SnakeEyes great - работает для версии 7+. если вы хотите использовать этот подход, нет необходимости в методе расширения, его можно написать напрямую, см. мой отредактированный ответ - если вы хотите его упростить :) –

 Смежные вопросы

  • Нет связанных вопросов^_^