2009-07-09 6 views
2

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

Имеет смысл использовать директиву 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> 

ответ

0

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

В свойствах getus 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(); } 
} 

Комментарии? Является ли это жизнеспособным решением?

1

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

+0

RenderAction доступен только в фьючерсах ASP.Net MVC ... Я не уверен, хотим ли мы туда туда добраться. –