在自定义属性中查找mvc3动作方法参数

本文关键字:方法 参数 mvc3 自定义属性 查找 | 更新日期: 2023-09-27 18:17:12

我正在为一个mvc3应用程序实现用户权限管理。

我已经在数据库上定义了我的动作方法与ControllerName, ActionName,和参数包括ParameterName和ParameterType等。

我实现了一个继承自Authorize属性的自定义属性。

我想做的是找到在数据库上定义的内置动作中执行的动作,并计算用户是否具有指定动作的权限。

代码如下;

[HttpPost]
[MyAuthorize]
public ActionResult Edit(VendorPageItem entity)
{
  //...
}
public class MyAuthorize: System.Web.Mvc.AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException("httpContext");
        string controller = httpContext.Request.RequestContext.RouteData.Values["controller"].ToString();
        string action = httpContext.Request.RequestContext.RouteData.Values["action"].ToString();
        int userId = SessionState.Current.LoginParameter.VendorUserID;
        List<string> parameterTypes = new List<string>();
        //TODO: Find out action method parameter types. 
        return IoCWorker.Resolve<IUserRightService>().HasUserRightToAction(userId, controller, action, parameterTypes);
    }
}

我的问题是在我的自定义属性中找到方法参数类型。

谢谢。

编辑:忘了说这是post action。(HttpPost)补充道。

在自定义属性中查找mvc3动作方法参数

我认为反思是答案。

一旦你有了控制器和动作,并且假设你事先知道名称空间,你就可以检查控制器Type并深入到它的方法和相对签名/重载。

除了controller和action之外,检查RouteData的全部内容可以告诉你它传递给方法的是什么。

我还没有试过,但从你说的来看,它似乎是这样工作的。

我不确定我是否正确理解了你的问题。如果你试图访问参数值,我有一个答案给你,如果你真的想知道参数类型,那么@Matteo Mosca的答案将是正确的:

这取决于参数的来源。不管是QueryString参数表单参数cookie还是…

ASP的模型绑定器基础结构。. NET尝试将参数映射到动作方法上。在您的自定义属性中,您可以使用上下文访问参数,例如

string input = httpContext.Request.Form["myInput"]

编辑:这当然不是最好的解决方案,因为您需要关于发布参数的信息。因为我不知道你的真正要求,我没有更好的建议。当然,您可以遍历Form集合。

可能是您将字段的名称作为MyAuthorizeAttribute的参数/属性传递。