Проверьте, находится ли атрибут на контроллере или в действии - PullRequest
2 голосов
/ 02 апреля 2011

Когда срабатывает атрибут, могу ли я проверить, был ли установлен контроллер или действие?

Поведение, которое я хочу: использовать атрибут Action, если существует, иначе использовать атрибут Controller. Примерно так:

public class TestAttribute : FilterAttribute, IAuthorizationFilter
{
    public TestAttribute(string optionalParam = "") { /*...*/ }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        bool isClassAttribute; // = ????

        bool hasActionAttribute = filterContext.ActionDescriptor.GetCustomAttributes(typeof(TestAttribute ), false).Length > 0;

        if (isClassAttribute && hasActionAttribute)
            return; // handle in Action attribute
        else
            ; // do stuff with optionalParam...
    }
}

[TestAttribute]
public class TestClass 
{    
    [TestAttribute(optionalParam:"foo"]
    public ActionResult TestMethod() { return null; }    
}

Я мог бы сделать это со свойством Order, но не хочу каждый раз устанавливать его (или funky ).

Редактировать / Решение

ОК, нашел решение моей проблемы (но не вопрос) - установка базового параметра Attribute AllowMultiple = false означает last instance of the same filter type is allowed, and all others are discarded (и атрибуты Controller запускаются первыми (?), Так что хорошо бы пойти ...).

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class TestAttribute : FilterAttribute, IAuthorizationFilter
{
    public TestAttribute(string optionalParam = "") { /*...*/ }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        // this should be the Action attribute (if exists), else the Controller attribute...
    }
}

Во всяком случае, я задал немного другой вопрос, так что все равно даст очки за ответ;)

1 Ответ

0 голосов
/ 03 апреля 2011

Я считаю, что элемент в любом случае выполняется при каждом вызове метода, но вы можете сослаться, например, на:

public void OnActionExecuting(ActionExecutingContext filterContext) { }
..
..

string controllerName = filterContext.Controller.GetType().Name;
//either or:
string actionMethodName = filterContext.ActionDescriptor.ActionName;
string actionMethodName = filterContext.RouteData.Values["action"].ToString();

Если ваше actionMethodName равно нулю, то это потенциально от вашего контроллера - хотя, как я сказал, они могут получитьвызывается, когда метод действия вызывается как есть (не уверен на 100% в этом, хотя протестируйте приведенный выше код, и это должно ответить на ваш вопрос)

Надеюсь, это поможет:)

...