У меня проблема с порядком вызова моего ActionFilter.
Я создал фильтр, который устанавливает макет MasterName:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class MasterNameAttribute : ActionFilterAttribute
{
public String MasterName { get; set; }
public MasterNameAttribute(String masterName)
{
this.MasterName = masterName;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
viewResult.MasterName = this.MasterName;
Я использовал его в своем контроллере следующим образом:
[MasterName("_Layout_Main")]
public partial class ProjectController : BaseController
{
[MasterName("_Layout_Special")]
public ActionResult Dashboard()
{
Нет, у меня проблема в том, что ASP MVC вызывает фильтры в порядке Action-Scope -> Method-Scope. Но я хочу, чтобы фильтр Method-Scope был результатом и переопределял фильтр Controller-Scope.
Мой вопрос:
- В MSDN написано, что фильтр вызывается в порядке значений Enum из "AttributeTargets" Enum (Class = 4, Method = 0x40). Почему фильтр Controller-Scope вызывается последним?
- Как я могу решить проблему с заказом, не используя свойство «Заказ»?
Является ли правильный способ определить, существует ли фильтр Methode-Scope типа samt?
Советы
.ControllerDescriptor.IsDefined(...
Мне это не помогло, потому что моя реальная реализация имеет некоторые условия, если MasterName установлено фильтром или нет. Таким образом, поиск атрибута Method-Scope не говорит мне, использовался ли фильтр или нет, и следует ли использовать фильтр Controller-Scope или нет (только если фильтр Method-Scope не используется). Поэтому я думаю, что правильный порядок звонков был бы лучшим решением.
Относится к ответу @swapneel:
Нет, извините, это не соответствует моим потребностям. У меня есть очень сложный выбор макета, который лучше всего задается атрибутами. Мне нужно наследование, перезапись и логика порядка.
Нравиться:
[MasterName("_Layout1", Host = "sub1.domain.com")]
[MasterName("_Layout2", Host = "sub2.domain.com")]
[MasterName("_Layout3", Host = "sub3.domain.com")]
public partial class ProjectController : BaseController
{
[MasterName("_Layout_1_1", Host = "sub1.domain.com")]
[MasterName("_Layout_2_1", Host = "sub2.domain.com")]
public ActionResult Dashboard()
{
Здесь вызов действия «Панель инструментов» с хостом «sub2.domain.com» должен перезаписать определяемое контроллером «_Layout2» MasterName на «_Layout2_1». При всех других действиях он не будет перезаписан, а "_Layout2" является активным.
С уважением Штефан!