2009-11-27 2 views
0

Мы пытаемся создать более конкретную [Авторизоваться] Атрибут для Asp.Net MVCатрибут Специализированная Авторизоваться для ASP.NET MVC приложения

[AttributeUsage(AttributeTargets.All)] 
    public class AuthoriseUser : System.Attribute 
    { 
     public AuthoriseUser(string PermRequest) 
     { 
      //Do Some Auth. 
     } 
    } 

, и мы называем это как так,

[AuthoriseUser("CanViewRoles")] 

Но когда отладка функции никогда не вызывается.

Теперь мы, очевидно, делаем что-то очень плохое, я видел PostSharp, но из-за природы проекта, я не могу его использовать. Как я могу достичь этого, используя только .Net?

ответ

0

Атрибуты не предназначены для функциональной роли. Вам нужно написать код, используя отражение где-нибудь в вашем проекте, который читает метаданные типов классов [и реквизита, методы и т. Д.] И находит применимые к нему атрибуты. Основываясь на применяемых атрибутах, вы можете принимать решения во время выполнения о том, что с этим делать. Как правило, это делается в базовых классах вашей библиотеки.

В качестве примера в наших проектах мы имеем атрибут под названием «Поиск». Этот атрибут применяется к свойствам бизнес-объектов, которые необходимо включить в поиск. Когда клиент вызывает метод поиска, мы отфильтровываем все реквизиты, украшенные атрибутом 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(); 
    } 
+0

У вас есть пример этого? – LiamB

+0

код добавлен :) :) –

+1

Ваш ответ правильный за пределами ASP.NET MVC; Однако фильтры действия ASP.NET MVC являются особым видом атрибута. Они выполняются как часть конвейера MVC и позволяют обрабатывать определенные события. http://www.asp.net/learn/mvc/tutorial-14-cs.aspx. Ваш ответ неверен в контексте ASP.NET MVC. –

3

Атрибут используется для «украшения» метода/свойства/класса, чтобы вы могли дать дополнительный/дополнительный смысл этому методу.

При оформлении метода с определенным атрибутом это не означает, что атрибут получает выполнение всякий раз, когда вы вызываете этот метод. Если вы хотите этого поведения, вам действительно нужно взглянуть на ковер-ткача, например, на PostSharp, чтобы сплести дополнительный код с помощью методов/свойств, которые вы украсили атрибутом.

2

Атрибуты в .NET используются для украшения класса или метода, но вам необходимо написать код для запроса этой информации. Например, чтобы проверить, что класс украшен пользовательских атрибутов вы могли бы использовать что-то вроде этого:

var attributes = (AuthoriseUser[])typeof(YourType) 
    .GetCustomAttributes(typeof(AuthoriseUser), true); 

Затем вы можете прочитать метаданные, связанные с этим атрибутом.

Смежные вопросы