【问题标题】:MVC Action calling another action doesn't trigger OnActionExecuting调用另一个操作的 MVC 操作不会触发 OnActionExecuting
【发布时间】:2014-09-21 02:38:52
【问题描述】:

我在我的应用程序中设置了一些自定义 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)
    {
        ...
    }
}

OnActionExecutingCarBoard 之前被点击一次,然后调用 CreateCarForCarId 但从未点击 OnActionExecuting。

我的 businessLogic 包含检查以确保只有管理员可以创建汽车,但我原以为这会让我甚至不必点击 businessLogic。

有什么想法吗?

谢谢,

【问题讨论】:

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


    【解决方案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)
        {
            //...
        }
    }
    

    【讨论】:

    • 这就是我接下来的想法,但我很好奇是否有其他解决方案......猜不!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2020-03-10
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多