假设此ActionFilter:
public class MemberAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.HttpContext.Session["someValue"] == null)
{
filterContext.HttpContext.Response.Redirect("/Error");
}
}
}
并假设此基本控制器是
[Member]
public class BaseController : Controller
{
protected int _memberID;
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
_memberID = int.Parse(requestContext.HttpContext.Session["someValue"].ToString());
}
}
在扩展BaseController的控制器中,我可以执行以下操作:
[HttpPost]
public ActionResult Create(PlayerCreateVM vm)
{
if(!ModelState.IsValid)
{
return View(vm);
}
vm.Player.MemberID = _memberID;
_playerManager.Create(vm.Player.ToModel());
return RedirectToAction("Index");
}
正如您在操作中所看到的,在这种情况下,创建“玩家”依赖于_memberID不为空。因此,将ActionFilter应用于BaseController。除非此值不为null,否则子类Controllers中的任何操作都不会触发。
但是,BaseControllers Initialize()和BaseController的构造函数仍然会触发。是否有等效类型的Filter实际上阻止了构造函数及其基础的构建。