【问题标题】:Get parameter's value of a Data Annotation获取数据注释的参数值
【发布时间】:2013-08-21 18:32:33
【问题描述】:

目标

获取数据注释的参数值。

问题

我不知道语法。

场景

我的应用中有以下控制器:

[PermissionsFilter(Roles = "Administrator")]
public ActionResult Index()
{
    return View();
}

我的应用程序中有以下方法:

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    return true;
}

我需要的似乎很简单:如何在AuthorizeCore方法上得到Administrator字符串?是通过httpContext参数吗?

知识聚焦

AuthorizeCore 属于实现AuthorizeAttributePermissionFilters 类。换句话说,我重写了Authorize 属性的AuthorizeCore 方法来创建一个新的(PermissionFilters 属性)。

【问题讨论】:

    标签: c# asp.net-mvc-4 data-annotations


    【解决方案1】:

    您需要使用反射来获取应用于控制器操作的属性。下面是一个快速而肮脏的例子,说明如何做到这一点:

        private string GetPermissionFilerValue()
        {
            object[] attributes = typeof(YourControllerType).GetType().GetMethod("Index").GetCustomAttributes(typeof (PermissionFilterAttribute));
    
            return attributes[0].Roles;
        }
    

    基本上,您需要获取对控制器类型的引用,然后从中获取对控制器上方法的引用。一旦你有了它,在 MethodInfo 对象的表单中,你可以使用 GetCustomAttributes 来获取应用到你的方法的所有自定义属性或特定类型的所有自定义属性。拥有属性实例后,您可以检查 Roles 属性。

    正如我所提到的,上面的示例是一个非常快速而肮脏的演示,演示了如何获取特定方法的属性实例。您可能需要对其进行调整以适应您的特定场景。

    【讨论】:

    • 您可能需要一个更灵活的解决方案,而不是硬编码到控制器类型和操作方法名称。不过,您必须弄清楚如何检索它们。
    • 我明白你的想法,正如你所说,你的潜行代码是一种肮脏的执行方式。顺便说一句,这(真的)有必要检查用户是否处于正确的角色吗? (题外话)
    • 如果您使用的是 ASP.Net MVC,不,这绝对不是检查用户是否处于角色中的首选方法。查看 HttpContext.Current.User.IsInRole("yourRole")
    • 很难说不知道你具体想做什么。反射是 .Net 中更通用的 API,允许您检查类型和成员并对其进行操作。您可以从 MSDN 关于 System.Reflection 命名空间的文档开始:msdn.microsoft.com/en-us/library/system.reflection.aspx 或反射概述:msdn.microsoft.com/en-us/library/ms173183(v=vs.110).aspx
    • 啊,是的,自定义属性类的标准是使用属性后缀,但这不是必需的。如果您的 PermissionFilters 属性类不符合该标准,那么您将始终使用 PermisionFilters。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2023-04-08
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多