为所有操作添加默认参数

时间:2013-09-20 09:44:52

标签: c# asp.net asp.net-mvc-4 routing action-filter

我想添加某些方法,我希望在执行任何操作之前执行它们。所以我创建了这个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);
    }

}

如您所见,我想检查用户是否在网址中请求了促销ID。问题是,为了使其正常工作,我必须为我的所有操作添加参数promotionId(意味着更改我所有操作的签名),我不想这样做。

有没有办法覆盖默认操作方法并为其添加可选参数,以便将其添加到我的所有操作中?

或者有更好的方法吗?

1 个答案:

答案 0 :(得分: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);
    }

}