1

特定のメソッドを追加し、アクションを実行する前にそれらを実行したいと考えています。したがって、すべてのコントローラーが継承するこの BaseController を作成しました

public class BaseController : Controller
{
    protected int promotionId = 0;

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        bool thereIsPromo = false;
        if (filterContext.ActionParameters.Keys.Contains("promotionId"))
        {
            thereIsPromo = true;
        }

        var foo = filterContext.RouteData;
        // TODO: use the foo route value to perform some action

        base.OnActionExecuting(filterContext);
    }

}

ご覧のとおり、ユーザーが URL でプロモーション ID をリクエストしたかどうかを確認したいと思います。問題は、これを機能させるために、すべてのアクションにパラメーターを追加する必要がありpromotionId(すべてのアクションの署名を変更することを意味します)、それをしたくないということです。

デフォルトのアクション メソッドをオーバーライドし、オプションのパラメータを追加してすべてのアクションに追加する方法はありますか?

または、これを行うためのより良い方法はありますか?

4

1 に答える 1

0

promotionIdすべてのアクションにパラメーターを追加する必要はありません。Requestコントローラーのプロパティを使用して、URL にこのパラメーターがあるかどうかを確認できます。

public class BaseController : Controller
{
    protected int promotionId = 0;

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        bool thereIsPromo = false;

        // Check if the request has the paramter PromotionId
        if (Request.Params.AllKeys.Contains("promotionId"))
        {
            promotionId = int.Parse(Request["promotionId"]);
            thereIsPromo = true;
        }

        var foo = filterContext.RouteData;
        // TODO: use the foo route value to perform some action

        base.OnActionExecuting(filterContext);
    }

}
于 2013-09-20T10:44:24.413 に答える