相关疑难解决方法(0)

OutputCache VaryByParam根据不应包含的参数而变化

我在MVC 5中使用OutputCache来缓存服务器上的视图.

我只想基于查询字符串中的两个参数来缓存视图.

行动方法

[HttpGet]
[OutputCache(Location = OutputCacheLocation.Server, Duration = 60*10, VaryByParam = "id;quoteid")]
public ActionResult MyAction(int id, ProductCategoryType category)
{
    return Content(DateTime.Now.ToString());
}
Run Code Online (Sandbox Code Playgroud)

路线

context.MapRoute(
"MyCustomRoute",
"myarea/{controller}/{action}/{id}/{category}/{name}/{quoteId}",
new { controller = "MyController", name = UrlParameter.Optional, quoteId = UrlParameter.Optional },
new[] { "MyNamespace.Areas.MyArea.Controllers" });
Run Code Online (Sandbox Code Playgroud)

网址

http://localhost:17191/myarea/mycontroller/myaction/2/1/a-holiday/aquoteid
Run Code Online (Sandbox Code Playgroud)

这可以正常工作并绑定数据,但是,如果我更改{name}了URL部分的任何部分,它仍然会生成一个新的缓存项,即使在我的操作方法中我已经指出了VaryByParam="id;quoteid"

例如...

http://localhost:17191/myarea/mycontroller/myaction/2/1/a-holiday/somequoteid
Run Code Online (Sandbox Code Playgroud)

http://localhost:17191/myarea/mycontroller/myaction/2/1/another-holiday/somequoteid
Run Code Online (Sandbox Code Playgroud)

...正在生成不同的DateTime输出 - 但它们不应该 - 它们应该是相同的.

我做错了什么,我怎样才能实现理想的行为?


编辑

需要明确的ProductCategoryType是,Enum是受其int价值约束的.当我调试时,对此的绑定是正确的ActionResult

编辑2 自从我被要求展示以来ProductCategoryType,我在下面添加了它.当我调试时,这确实正确绑定 - 我不认为它与问题有任何关系.

public enum ProductCategoryType …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc outputcache

6
推荐指数
1
解决办法
2717
查看次数

VaryByParam ="*"还读取RouteData.Values吗?

在我的asp.net mvc项目中,我在控制器上启用输出缓存,如下所示

[OutputCache(Duration = 100, VaryByParam = "*", VaryByHeader = "X-Requested-With")]
public class CatalogController : BaseController
{
    public ActionResult Index(string seller)
    {
        // I do something
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,直到创建我自己的Route类,如下所示

public class MyRoute : Route
{
    // there is a constructor here..

    // I override this method.. 
    // just to add one data called 'seller' to RouteData
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var data = base.GetRouteData(httpContext);
        if (data == null) return null;

        var seller = DoSomeMagicHere();

        // add seller
        data.Values.Add("seller", …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc outputcache asp.net-mvc-3

5
推荐指数
1
解决办法
2943
查看次数

标签 统计

asp.net-mvc ×2

outputcache ×2

asp.net-mvc-3 ×1

c# ×1