2016-03-30 2 views
0

Так у меня есть следующие действия, которые я пытаюсь добавить кэширование вывода в:OutputCache 1 акция, 2 просмотров

[OutputCache(CacheProfile = OutputCacheProfileNames.Hours24)] 
public ActionResult ContactUs() 
{ 
    ContactUsModel model = _modelBuilder.BuildContactUsModel(); 

    if (Request.IsAjaxRequest()) 
    { 
    return Json(StringFromPartial(partialTemplate, model), JsonRequestBehavior.AllowGet); 
    } 
    else 
    { 
    return View(model); 
    } 
} 

Но это, кажется, кэшировать первое представление, что запрашивается - то есть либо JSON ИЛИ обычный вид.

Есть ли способ заставить выходное кэширование работать для обоих представлений, не отделяя их от одного и того же действия?

+0

попробовать [OutputCache (Duration = 10, VaryByParam = "имя")] –

+2

выписка varyby http://blog.danielcorreia.net/asp-net-mvc-vary-by-current-user/ –

+0

@ REDEVI_, к сожалению, я не могу использовать 'VaryByParam', поскольку никакие параметры не передаются в действие, я буду читать эту обычную вещь, но похоже, что это может быть способ пойти – Pete

ответ

1

Вы избили меня к удару, отвечая на свой собственный вопрос, но я думал, что этот код может по-прежнему быть полезным. Поскольку изменение пользователем является таким распространенным сценарием, вероятно, вы должны учитывать, что можете это сделать и ваш AJAX различаются. Этот код позволит вам изменять любое количество настраиваемых параметров, добавляя одну строку для изменения.

public override string GetVaryByCustomString(System.Web.HttpContext context, string custom) 
{ 
    var args = custom.ToLower().Split(';'); 
    var sb = new StringBuilder(); 

    foreach (var arg in args) 
    { 
     switch (arg) 
     { 
      case "user": 
       sb.Append(User.Identity.Name); 
       break; 
      case "ajax": 
       if (context.Request.Headers["X-Requested-With"] != null) 
       { 
        // "XMLHttpRequest" will be appended if it's an AJAX request 
        sb.Append(context.Request.Headers["X-Requested-With"]); 
       } 
       break; 
      default: 
       continue; 
     } 
    } 

    return sb.ToString(); 
} 

Тогда вы бы просто сделали что-то вроде следующего, если вам нужно изменить несколько пользовательских параметров.

[OutputCache(CacheProfile = OutputCacheProfileNames.Hours24, VaryByCustom = "User;Ajax")] 

Затем, если вам когда-либо понадобится дополнительный пользовательский параметр, вы просто добавляете утверждения case для покрытия этих сценариев.

+0

приятно, не думал о множественном сценарий – Pete

1

Благодаря комментариям REDEVI_ для указания меня в правильном направлении, я смог решить эту проблему.

я изменил кэширование вывода на:

[OutputCache(CacheProfile = OutputCacheProfileNames.Hours24, VaryByCustom = "IsAjax")] 

И тогда в моем файле global.asax, я добавил следующее переопределение:

public override string GetVaryByCustomString(HttpContext context, string custom) 
    { 
     if (context != null) 
     { 
      switch (custom) 
      { 
       case "IsAjax": 
        return new HttpRequestWrapper(context.Request).IsAjaxRequest() ? "IsAjax" : "IsNotAjax"; 
      } 
     } 

     return base.GetVaryByCustomString(context, custom); 
    }