質問

I want to add certain methods and I want them to be executed before executing any action. So I created this BaseController from which all my controllers will inherit

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);
    }

}

As you can see I want to check if the user has requested a promotion Id in the URL. The problem is, in order to get this working, I have to add a parameter promotionId to all my actions (meaning change the signature of all my actions) and I don't want to do that.

Is there a way to override the default action method and add an optional parameter to it so it would be added to all my actions ?

Or is there a better way to do this ?

役に立ちましたか?

解決

You don't have to add promotionId parameter in all your actions. You can check if the url has this parameter using the Request property of your controller.

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);
    }

}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top