Подтвердить что ты не робот

В чем разница между атрибутами и фильтрами в MVC

Теперь я могу получить сравнение не только с определением.

Пример:

SomeClassAttribute (or ISomeClassAttribute)

VS

SomeClassFilter (or ISomeClassFilter)

У меня такое чувство, что их можно использовать одинаково, но, вообще говоря, "применяется атрибут", а "фильтр - это функциональность, которую они производят". Поэтому я мог бы добавить атрибут метода (или класса или другого) для применения фильтра.

4b9b3361

Ответ 1

"Таким образом, я мог бы добавить атрибут метода (или класса или что-то еще) к применить фильтр."

У вас есть это предложение прямо там. Фильтры и Атрибуты не совсем сопоставимы с концепциями, они обслуживают две разные функции.

Я считаю, что Фильтрация в MVC очень хорошо освещена в статье

Ответ 2

Атрибуты - это особенность .NET, фильтры MVC реализованы с использованием этой функции.

Например, System.Web.Mvc.HandleErrorAttribute происходит от BCL System.Attribute. Фильтры применяют поведение через крючки в конвейер MVC (грубо говоря).

Ответ 3

В большинстве случаев атрибуты используются для описания метаданных о методах/классах и т.д. Например, существует атрибут Serializable, указывающий, что класс может быть сериализован, атрибут TestClass, чтобы пометить класс как тест, и атрибут Obsolete, чтобы отметить что-то как устаревшее. Отражение используется для извлечения этой информации процессом, который хочет их использовать. Он хорошо описывает этот question об атрибутах.

Атрибуты фильтра в MVC, такие как AuthorizeAttribute, передают дополнительную информацию, аналогичную другим атрибутам - метод контроллера или класс, украшенный по AuthorizeAttribute указывает, что авторизация требуется при использовании MVC. Но в отличие от некоторых других атрибутов сами атрибуты фильтра содержат логику для выполнения фактической функции - атрибут AuthorizeAttribute происходит от Атрибут (через FilterAttribute), а также реализует IAuthorizationFilter. Когда MVC обнаружит класс контроллера, украшенный AuthorizeAttribute, он вызовет метод AuthorizeAttribute.OnAuthorization() для выполнения авторизации. Кроме того, когда вы указываете глобальные фильтры, вы добавляете класс атрибута непосредственно в список фильтров, который может быть немного запутанным, но то, как он работает:

void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new AuthorizeAttribute());
}