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

时间:2011-12-09 09:08:55

标签: c# asp.net-mvc-3 custom-attributes

我正在努力在mvc3应用程序上实现用户权限管理。

我已经在ControllerName,ActionName和Parameters上定义了我的动作方法,参数包括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);
    }
}

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

感谢。

编辑:忘了提到那是后期行动。 [HttpPost]补充道。

2 个答案:

答案 0 :(得分:2)

我认为反思是这里的答案。

一旦掌握了控制器和操作,并假设您事先知道了命名空间,就可以检查控制器Type并深入查看其方法和相对签名/重载。

除了控制器和操作之外,检查RouteData的全部内容还可以告诉您传递给方法的内容。

我还没有尝试过,但是根据你所说的,它似乎会以这种方式运作。

答案 1 :(得分:1)

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

这取决于参数的来源。无论是QueryString参数还是表单参数或cookie还是......

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

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

编辑: 这当然不是最好的解决方案,因为您需要有关已发布参数的信息。由于我不知道你的真实要求,我无法提出更好的建议。当然,您可以遍历表单集合。

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