Как сохранить данные главной страницы ASP.NET в кеше приложения в течение заданного времени - PullRequest
0 голосов
/ 05 августа 2010

Я читал ' ASP.NET-MVC Tutorials ', чтобы узнать, как сгенерировать данные для представления «главная страница» в приложении ASP.NET MVC. Он предлагает схему использования «базового контроллера» и генерации данных в его конструкторе.

Моя проблема в том, что я хочу хранить данные приложения в кеше приложения, а не в словаре viewdata. Кеш приложения не существует в конструкторах контроллера, как его установил позже, как я могу сохранить данные для представления главной страницы в кеше приложения?

Ответы [ 2 ]

0 голосов
/ 06 августа 2010

Если вы переопределите метод Initialize в базовом контроллере, у вас будет доступ к Cache. Initialize будет выполнено до того, как какое-либо действие будет выполнено для любого запроса на действие в контроллере.

protected override void Initialize(RequestContext requestContext)
{
    base.Initialize(requestContext);
    var list = requestContext.HttpContext.Cache[testMessageCacheAndViewDataKey];
    if (list == null) { ... }
}
0 голосов
/ 05 августа 2010

Разобрался. Ну .... версия, которая работает. Мне нужно было добавить данные applciation в кеш при запуске метода ControllerActionInvoker 'InvokeAction'. Для этого мне нужно было создать новый ActionInvoker, как показано ниже.

public class ContextActionInvoker : ControllerActionInvoker
{
    public const string testMessageCacheAndViewDataKey = "TESTMESSAGE";
    private const int testListLifetimeInMinutes = 10;

    public ContextActionInvoker(ControllerContext controllerContext) : base() { }

    public override bool InvokeAction(ControllerContext context, string actionName)
    {
        // Cache a test list if not already done so
        var list = context.HttpContext.Cache[testMessageCacheAndViewDataKey];
        if (list == null)
        {
            list = new SelectList(new[] {
                new SelectListItem { Text = "Text 10", Value = "10" },
                new SelectListItem { Text = "Text 15", Value = "15", Selected = true },
                new SelectListItem { Text = "Text 25", Value = "25" },
                new SelectListItem { Text = "Text 50", Value = "50" },
                new SelectListItem { Text = "Text 100", Value = "100" },
                new SelectListItem { Text = "Text 1000", Value = "1000" }
            }, "Value", "Text");
            context.HttpContext.Cache.Insert(testMessageCacheAndViewDataKey, list, null, DateTime.Now.AddMinutes(testListLifetimeInMinutes), TimeSpan.Zero);
        }
        context.Controller.ViewData[testMessageCacheAndViewDataKey] = list;

        return base.InvokeAction(context, actionName);
    }
}

Как только это было сделано, мне нужно было создать собственную фабрику контроллеров, которая бы вызывала правильный метод ActionInvoker. Я сделал это, сделав ...

public class ContextControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        IController controller = base.GetControllerInstance(requestContext, controllerType);
        Controller contextController = controller as Controller;

        if (contextController != null)
        {
            var context = new ControllerContext(requestContext, contextController);
            contextController.ActionInvoker = new ContextActionInvoker(context);
        }
        return controller;
    }
}

Затем мне пришлось сообщить приложению MVC, какой контроллер использовать. Я сделал это, немного изменив Global.asax.cs ...

public class MvcApplication : System.Web.HttpApplication
{
    ...

    protected void Application_Start()
    {
        ...
        ControllerBuilder.Current.SetControllerFactory(typeof(ContextControllerFactory));
        ...
    }

    ...
}

Затем на главной странице я использовал HTML-метод dropdownlist, выполнив ...

<%: Html.DropDownList(MVC_MasterPage_data_set_in_cache.Controllers.ContextActionInvoker.testMessageCacheAndViewDataKey) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...