代码之家  ›  专栏  ›  技术社区  ›  THX-1138

ASP.NET MVC:上下文相关验证

  •  1
  • THX-1138  · 技术社区  · 15 年前

    我有大量的操作方法需要验证 orderId 传递给动作的方式如下:

    public ActionResult CancelOrder(int orderId) {
        If (!MyDatabase.VerifyOwnership(orderId, User.Identity.Name) return View("You are an imposter!");
        // ...
    }
    

    什么是简单的验证方法 有序的 属于 User.IdentityName 不需要反复复制/粘贴相同的行?

    我试过了 ActionFilterAttribute 但它无法访问上下文( MyDatabase 例如,对象)。处理这件事的好方法是什么?

    2 回复  |  直到 15 年前
        1
  •  1
  •   John Farrell    15 年前

    “但它没有访问上下文的权限”

    确实如此:

    public class VerifyOwner : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var myController = (MyControllerType)filterContext.Controller;
    
            if (!myController.MyDatabase.VerifyOwnership(orderId, User.Identity.Name) 
                //do what you do
    
            base.OnActionExecuting(filterContext);
        }
    }
    

    您所要做的就是将控制器属性强制转换为控制器类型。这非常容易,因为您有一个自定义的基本控制器,所有控制器都从中继承。然后将该基本控制器设置为具有mydatabase属性,您可以轻松地跨多个控制器使用该属性。

        2
  •  1
  •   Daniel Elliott    15 年前

    您的控制器似乎可以访问您的上下文。因此,如果使用实现 IAuthorizationFilter 你可以把 filterContext.Controller OnAuthorization 方法设置为您的控制器类型,并能够首先执行您设置的操作。(我认为这是该走的路!)

    仁慈,