我的应用程序中有一些自定义的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。
有什么想法吗?
谢谢,
答案 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)
{
//...
}
}