В чем разница между атрибутами и фильтрами в MVC
Теперь я могу получить сравнение, а не просто определение.
Пример:
SomeClassAttribute (or ISomeClassAttribute)
В.С.
SomeClassFilter (or ISomeClassFilter)
У меня есть ощущение, что они могут быть использованы таким же образом, но, вообще говоря, "атрибут применяется", а "фильтр - это функциональность, которую они создают". Таким образом, я мог бы "добавить атрибут к методу (или классу или какому-либо другому), чтобы применить фильтр.
3 ответа
"Таким образом, я могу" добавить атрибут к методу (или классу, или какому-либо другому), чтобы применить фильтр ".
Вы получили это в этом предложении прямо там. Фильтры и атрибуты - не совсем сопоставимые понятия, они выполняют две разные функции.
Я считаю, что фильтрация в MVC очень хорошо освещена в этой статье MSDN.
Атрибуты (по крайней мере, те, которые применяются к фильтрам) отмечают, к чему применяется фильтр, то есть метод действия или контроллер. Примером может служить Authorize
приписывать. Этот атрибут соответствует AuthorizationFilter, который реализует IAuthorizationFilter
интерфейс. Применяя Authorize
Атрибут метода действия указывает MVC авторизовать запрос, нацеленный на этот метод действия, применяя его к контроллеру, говорит MVC авторизовать любой запрос, нацеленный на метод действия контроллера, или же авторизация также может применяться глобально для всех запросов. Теперь я уже говорил, по крайней мере, те, которые применяются к фильтрам, потому что атрибуты являются концепцией и синтаксисом.NET, а не только MVC. Существуют атрибуты для многих других вещей, которые обычно предоставляют дополнительную информацию о свойстве, методе, классе, к которому они применяются.
В большинстве случаев атрибуты используются для описания метаданных о методах / классах / и т. Д. Например, есть атрибут Serializable, чтобы указать, что класс можно сериализовать, атрибут TestClass, чтобы пометить класс как тест, и атрибут Obsolete, чтобы пометить что-то как устаревшее. Отражение используется для извлечения этой информации процессом, который хочет их использовать. Это хорошо освещено в этом вопросе об атрибутах.
Атрибуты фильтра в MVC, такие как AuthorizeAttribute, передают дополнительную информацию, аналогичную другим атрибутам - метод или класс контроллера, оформленный AuthorizeAttribute, указывает, что при использовании MVC требуется авторизация. Но в отличие от некоторых других атрибутов, сами атрибуты фильтра содержат логику для выполнения фактической функции - AuthorizeAttribute наследуется от Attribute (через FilterAttribute), а также реализует IAuthorizationFilter. Когда MVC находит класс контроллера, оформленный AuthorizeAttribute, он вызывает метод AuthorizeAttribute.OnAuthorization() для выполнения авторизации. Кроме того, когда вы указываете глобальные фильтры, вы добавляете сам класс атрибута в список фильтров, что может немного сбивать с толку, но вот как это работает:
void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AuthorizeAttribute());
}
Атрибуты являются функцией.NET, фильтры MVC реализованы с использованием этой функции.
Например, System.Web.Mvc.HandleErrorAttribute является производным от BCL System.Attribute. Фильтры применяют поведение через хуки в конвейер MVC (грубо говоря).