我一直在阅读“ASP.NET-MVC Tutorials”,以了解如何为ASP.NET MVC应用程序中的“母版页”视图生成数据。它建议使用“基本控制器”并在其构造函数中生成数据的模式。
我的问题是我希望将应用程序数据存储在应用程序缓存中而不是viewdata字典中。应用程序缓存在控制器构造函数中不存在,稍后如何设置,如何在应用程序缓存中存储母版页视图的数据?
答案 0 :(得分:0)
想出来。嗯......一个有效的版本。当ControllerActionInvoker的'InvokeAction'方法触发时,我需要将applciation数据添加到缓存中。要做到这一点,我必须创建一个新的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);
}
}
完成此操作后,我需要创建一个自定义controllerfactory,以确保调用正确的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应用程序使用哪个controllerfactory。我通过改变Global.asax.cs来做到这一点......
public class MvcApplication : System.Web.HttpApplication
{
...
protected void Application_Start()
{
...
ControllerBuilder.Current.SetControllerFactory(typeof(ContextControllerFactory));
...
}
...
}
然后在母版页上我使用了下拉列表HTML帮助方法,通过执行...
<%: Html.DropDownList(MVC_MasterPage_data_set_in_cache.Controllers.ContextActionInvoker.testMessageCacheAndViewDataKey) %>
答案 1 :(得分:0)
如果覆盖基本控制器中的Initialize
方法,则可以访问Cache
。 Initialize
将在对控制器中的任何操作请求执行任何操作之前执行。
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
var list = requestContext.HttpContext.Cache[testMessageCacheAndViewDataKey];
if (list == null) { ... }
}