我有很多动作方法,需要验证传递给动作的orderId
的所有权,如:
public ActionResult CancelOrder(int orderId) {
If (!MyDatabase.VerifyOwnership(orderId, User.Identity.Name) return View("You are an imposter!");
// ...
}
验证orderId
属于User.IdentityName
的简单方法是什么,而不必一遍又一遍地复制/粘贴相同的行?
我尝试了ActionFilterAttribute
,但它无法访问上下文(例如MyDatabase
对象)。处理这个问题的好方法是什么?
答案 0 :(得分:1)
您的控制器似乎可以访问您的上下文。因此,如果您使用实现IAuthorizationFilter
的操作过滤器属性,则可以将filterContext.Controller
方法中的OnAuthorization
强制转换为您的控制器类型,并且能够首先执行您设置的操作。 (我认为这是要走的路!)
善,
丹
答案 1 :(得分:1)
“但它无法访问上下文”
确实如此:
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);
}
}
您所要做的就是将Controller属性强制转换为控制器类型。这非常简单,您可以使用所有控制器继承的自定义控制器。然后将该基本控制器设置为具有MyDatabase属性,并且您可以轻松地跨多个控制器使用此属性。