我们正在尝试为Asp.Net MVC创建更具体的[授权]属性
[AttributeUsage(AttributeTargets.All)]
public class AuthoriseUser : System.Attribute
{
public AuthoriseUser(string PermRequest)
{
//Do Some Auth.
}
}
我们称之为,
[AuthoriseUser("CanViewRoles")]
但调试函数时从不调用。
现在我们显然做了一些非常错误的事情,我见过PostSharp但是由于项目的性质我无法使用它。我怎样才能使用.Net实现这一目标?
答案 0 :(得分:4)
您不需要从AuthorizeAttribute
派生您的课程吗?见Custom Authorization in the ASP.NET MVC Framework and Authorize Attribute
答案 1 :(得分:3)
属性用于“装饰”方法/属性/类,以便您可以为该方法提供额外/额外的含义。
通过使用某个属性修饰方法,这并不意味着只要调用该方法就会执行'attribute'。 如果你想要这种行为,你确实需要看一下代码编织器,比如像PostSharp一样,将额外的代码编织到你用属性装饰的方法/属性中。
答案 2 :(得分:2)
.NET中的属性用于装饰类或方法,但您需要编写代码来请求此信息。例如,要验证是否使用自定义属性修饰了类,可以使用以下内容:
var attributes = (AuthoriseUser[])typeof(YourType)
.GetCustomAttributes(typeof(AuthoriseUser), true);
然后,您可以阅读与此属性关联的元数据。
答案 3 :(得分:0)
属性不适用于扮演功能角色。您需要使用项目中某处的反射来编写代码,该反射读取类[和道具,方法等]的类型 - 元数据并查找应用于它的属性。根据应用的属性,您可以在运行时决定如何处理该属性。通常,这是在库的基类中完成的。
作为我们项目中的一个例子,我们有一个名为'Searchable'的属性。此属性应用于需要包含在搜索中的业务对象的属性。当客户端调用Search方法时,我们过滤掉所有使用Searchable属性修饰的道具,然后构造查询以对数据库进行搜索。实际上我们在SearchableAttribute类中没有任何与搜索功能相关的代码 - 实际上SearchableAttribute类中根本没有代码。
示例代码:
<强> SearchableAttribute 强>
/// <summary>
/// Holds mapping information of searchable fields of business objects.
/// </summary>
[global::System.AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public sealed class SearchableAttribute : Attribute
{
/// <summary>
/// Initializes a new instance of the SearchableAttributeAttribute class.
/// </summary>
public SearchableAttribute()
{
}
}
业务对象基类
中的方法 /// <summary>
/// Provides collection of all Searchable Fields.
/// </summary>
/// <returns>DataField collection</returns>
public IQueryable<DataField> GetSearchableDataFields()
{
PropertyInfo[] properties =
this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
var entityFields = from PropertyInfo property in properties
where property.GetCustomAttributes(typeof(SearchableAttribute), true).Length > 0
select
new DataField(
property,
(SearchableAttribute)property.GetCustomAttributes(typeof(SearchableAttribute), true)[0]);
return entityFields.AsQueryable();
}