过滤以防止执行控制器构造函数或初始化

时间:2018-09-13 01:00:52

标签: asp.net-mvc

假设此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实际上阻止了构造函数及其基础的构建。

0 个答案:

没有答案