调用另一个动作的MVC Action不会触发OnActionExecuting

时间:2014-07-29 16:19:18

标签: asp.net-mvc asp.net-mvc-4

我的应用程序中有一些自定义的ActionFilterAttributes设置,并使用OnActionExecuting进行一些检查。它工作正常,除非我在控制器中运行一个动作:

public class CarBoardController : GlobalController
{
    [HttpPost, ActionProperties(AccessLevel.Granted)]
    public ActionResult CarBoard(int carId)
    {
        var carModel = _businessLogic.GetCarForCarId(carId);

        if (carModel == null)
        {
            // if null create one
            carModel = CreateCarForCarId(carId);
        }

        var model = JsonConvert.SerializeObject(carModel);

        return PartialView(new CarViewModel(model));
    }

    [ActionProperties(AccessLevel.Admin)]
    public ICarBoardNode CreateCarForCarId(int carId)
    {
        return _businessLogic.CreateCarForCarId(carId);
    }
}

public class GlobalController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ...
    }
}

OnActionExecuting会在CarBoard之前点击一次,然后调用CreateCarForCarId,但永远不会点击OnActionExecuting。

我的businessLogic包含检查,以确保只有管理员可以创建汽车,但我认为这将使我甚至不必打到businessLogic。

有什么想法吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

OnActionExecuting是MVC管道的一部分。您的操作不是调用另一个操作,您的操作是调用一个方法来定义操作的作用。这听起来像是分裂的头发,但不同之处在于你所看到的行为的原因。

我会在这里做一些重构来完成你想要的东西。

public class CarBoardController : GlobalController
{
    [HttpPost, ActionProperties(AccessLevel.Granted)]
    public ActionResult CarBoard(int carId)
    {
        var carModel = _businessLogic.GetCarForCarId(carId);

        if (carModel == null)
        {
            PermissionChecker.CheckPermission(AccessLevel.Admin);
            carModel = CreateCarForCarId(carId);
        }

        var model = JsonConvert.SerializeObject(carModel);

        return PartialView(new CarViewModel(model));
    }

    [ActionProperties(AccessLevel.Admin)]
    public ICarBoardNode CreateCarForCarId(int carId)
    {
        return _businessLogic.CreateCarForCarId(carId);
    }
}

public class GlobalController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        PermissionChecker.CheckPermission(/* get desired access here  */);
    }
}

public class PermissionChecker
{
    public void CheckPermission(AccessLevel level)
    {
        //...
    }
}