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) { /* ... */ }
}

idただし、このソリューションは、実際にはオプションである場合に 2 つのアクションを意味するため、コードの繰り返しが発生する可能性があります。もちろん、私は次のようなことをすることができます

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 に答える