【问题标题】:Finding mvc3 action method parameters in custom attribute在自定义属性中查找 mvc3 操作方法参数
【发布时间】:2012-01-16 14:44:55
【问题描述】:

我正致力于在一个 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);
    }
}

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

谢谢。

编辑:忘了提到那是后期动作。 [HttpPost] 已添加。

【问题讨论】:

  • 我用这种方式玩过AuthorizeAttribute,但发现在控制器方法中检查权限更容易。

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


【解决方案1】:

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

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

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

我还没有尝试过,但从你说的情况来看,它似乎可以这样工作。

【讨论】:

  • 我在 Controllers 文件夹下有“Definitions”、“Management”、“Commons”等文件夹。所以命名空间是不同的。我尝试在 AuthorizeCore 方法中导航 httpContext 关于查找操作参数信息但没有运气。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 我的操作方法是一个 post aciton,我使用 jquery post。所以我没有查询字符串:(。
  • 好的,但是您可以以相同的方式访问 Forms 集合。我还不确定它是否适用于 AJAX 请求。
  • 我可以获取表单集合,但我在其中看到的是表单控制键和值。例如:作为键 ModelName.Entity.Name 及其值。但我在该表单集合上没有“VendorPageItem”类型。
  • 没错,你只看到了VendorPageItem的属性。 modelbinder 可以将表单内容映射到类的属性。我不确定您是否可以访问绑定的数据。
猜你喜欢
  • 2011-07-29
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多