3

我有以下动作:

public class HomeController : Controller
{
    public ActionResult Index(int? id) { /* ... */ }
}

我想要[OutputCache]那个动作,但我也想要那个:

  • 如果 ; 它不使用缓存id == null;或者
  • 如果id == null但持续时间不同,它会使用缓存。

我想我可以通过以下方式实现:

public class HomeController : Controller
{
    [OutputCache(VaryByParam = "none", Duration = 3600)]
    public ActionResult Index() { /* ... */ }

    [OutputCache(VaryByParam = "id", Duration = 60)]
    public ActionResult Index(int id) { /* ... */ }
}

但是,此解决方案意味着 2 个操作,而id实际是可选的,因此这可能会产生一些代码重复。当然我可以做类似的事情

public class HomeController : Controller
{
    [OutputCache(VaryByParam = "none", Duration = 3600)]
    public ActionResult Index() { return IndexHelper(null); }

    [OutputCache(VaryByParam = "id", Duration = 60)]
    public ActionResult Index(int id) { return IndexHelper(id); }

    private ActionResult IndexHelper(int? id) { /* ... */ }
}

但这看起来很难看。

你将如何实现这一点?

4

1 回答 1

3

我认为你所拥有的可能是最干净的选择。

我尚未测试的另一个选项可能是设置 VaryByCustom 参数并覆盖 Global.asax 中的 GetVaryByCustomString。

public override string GetVaryByCustomString(HttpContext context, string arg)
{
    if (arg.ToLower() == “id”)
    {
        // Extract and return value of id from query string, if present.
    }

    return base.GetVaryByCustomString(context, arg);
}

有关更多信息,请参见此处:http: //codebetter.com/blogs/darrell.norton/archive/2004/05/04/12724.aspx

于 2010-01-06T12:35:42.600 回答