Как узнать, используется ли OutputCache для данного элемента управления? - PullRequest
2 голосов
/ 09 июля 2009

Я пытаюсь написать общий пользовательский элемент управления "menu.ascx" в Asp.Net MVC, который сгенерирует правильно отформатированное HTML-меню для моего приложения. Меню генерируется на основе содержимого в базе данных и серии разрешений ресурсов ... которые передаются в PartialView через атрибут в ViewModel.

Имеет смысл использовать директиву OutputCache для элемента управления menu.ascx, чтобы ограничить количество обращений к базе данных и файлам ресурсов. Мое намерение состоит в том, чтобы пометить директиву OutputCache с атрибутами VaryByParam = none и VaryByCustom, реализуя пользовательский поиск безопасности в global.asax ...

Мой вопрос: как мы узнаем, когда будет использоваться OutputCache для menu.ascx, чтобы мы могли пропустить операции выборки данных при создании ViewModel в контроллере?


Пример кода UserControl:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl"  %>
<%@ OutputCache VaryByParam="none" VaryByCustom="customstring" %>
<ul>
<% var model = (IMyViewModel)Model; 
 foreach (var menu in model.Menus) { %>
   <li><a href="<%= menu.href %>"><%= menu.Text %></a></li>
<% } %>
</ul>

Ответы [ 2 ]

1 голос
/ 10 июля 2009

Вот интересное прочтение на эту тему Кэширование кольцевых отверстий в ASP.NET MVC и здесь Кэш результатов ASP.NET MVC , я бы в основном сделал это меню методом RenderAction на главной странице вызвать действие, которое будет извлекать данные из базы данных и theb, а затем кэшировать результат действия

0 голосов
/ 10 июля 2009

Я думаю, что нашел подходящий обходной путь для моей проблемы.

В получателе свойств Menus для моей конкретной реализации ViewModel я пишу прокси-код, чтобы вернуться обратно в экземплярный контроллер и запросить данные меню. Таким образом, я могу создавать данные меню на лету, когда PartialView запрашивает их. Если PartialView выходит из OutputCache, свойство Menu не будет запрошено.

Итак, моя IMyViewModel выглядит примерно так:

public interface IMyViewModel {

  IEnumerable<Menu> Menus { get; }

  ///<summary>
  /// A pointer back to the calling controller, which inherits from the abstract MyBaseController
  ///</summary>
  MyBaseController Controller { get; set; }

}

и моя конкретная реализация меню выглядит примерно так:

public IEnumerable<Menu> Menus 
{
   get { return Controller.GetMenus(); }
}

Комментарии? Это жизнеспособное решение?

...