Reputation: 2317
I have an action, let's say /Foo/Bar with a GET parameter in this action, get_cached, who define if we want to get the cached value or the "realtime".
This is made with the following code :
public ActionResult Bar()
{
var useCache = Request.Params["get_cached"] == "1" ? true : false;
if (useCache)
{
return RedirectToAction("BarCached");
}
else
{
return RedirectToAction("BarRealTime");
}
}
[OutputCache(Duration = 100, VaryByParam = "*")]
public ActionResult BarCached()
{
return Content("mystuff_cached");
}
public ActionResult BarRealTime()
{
return Content("mystuff_realtime");
}
No problem with this code, apart the url will be shown as BarCached or BarRealTime and i would get only Bar (the main action name).
I tried to change the RedirectToAction to the full method name like this :
return this.BarCached()
But this disable the cache capabilities !
So, how can render the ActionResult code from a method (render BarCached from Bar) using the OutputCache definitions on this method (OutputCache on BarCached) ?
Thanks by advance.
Upvotes: 0
Views: 553
Reputation: 2317
I ended using the System.Web.Caching
namespace who is the base cache handler of asp.net MVC.
I can access the cache repository of Asp.NET MVC with System.Web.HttpContext.Current.Cache
Using that, I store the ActionResult of "BarCached" and then I can get the cache feature the way I want using something like this :
Add a value to the cache
System.Web.HttpContext.Current.Cache.Insert(
"mykey",
"myvalue",
null,
DateTime.Now.AddSeconds(expirationInSeconds),
System.Web.Caching.Cache.NoSlidingExpiration
);
And get value from the cache
var myvalue = System.Web.HttpContext.Current.Cache.Get("mykey")
Upvotes: 0
Reputation: 5497
In the asp.net pipeline, ResolveRequestCache (which OutputCache relies on) occurs just after the request is authenticated. In your example above, by the time you have gotten to "Bar" it's too late to use output caching, as you have noted by saying that this.BarCached()
doesn't recognize the cache attribute.
If your problem is the performance of whatever generates "mystuff_"
, could you not just save the result of that call to the application cache and return it in your Bar()
method instead of the RedirectToAction
objects?
Not much of a solution I know, but hopefully helpful just the same.
Upvotes: 1