Порядок вызова области ActionFilterAttribute

У меня проблема с порядком вызова моего 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.

Мой вопрос:

  1. В MSDN написано, что фильтр вызывается в порядке значений Enum из "AttributeTargets" Enum (Class = 4, Method = 0x40). Почему фильтр Controller-Scope вызывается последним?
  2. Как я могу решить проблему с заказом, не используя свойство «Заказ»? Является ли правильный способ определить, существует ли фильтр 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" является активным.

С уважением Штефан!


person Steffen Mangold    schedule 18.05.2015    source источник


Ответы (1)


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

Если вы хотите установить одну или разные мастер-страницы для каждого представления во время выполнения или во время разработки. вы можете использовать _ViewStart.cshtml.


Файл _ViewStart.cshtml будет выполняться в начале визуализации каждого представления. Любой код, содержащийся в блоке кода в этом файле, будет выполняться перед любым кодом в представлении. Как правило, этот файл задает шаблон макета, который будет использоваться представлениями в приложении:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Приложение MVC может иметь несколько файлов _ViewStart.cshtml. Порядок, в котором выполняются эти файлы, зависит от расположения файлов в иерархии папок и конкретного отображаемого представления. Среда выполнения MVC сначала выполнит код из файла _ViewStart.cshtml, расположенного в корне папки Views. Затем он будет продвигаться вверх по иерархии папок, выполняя код в каждом _ViewStart.cshtml файле, который он найдет по пути. Например, если бы у нас было _ViewStart.cshtml файлов в следующих местах:

Скопирован приведенный выше текст из этой ссылки - it-used" rel="nofollow">какова-цель-представленияstartcshtml-файл-и-как-он-используется

person swapneel    schedule 18.05.2015
comment
Нет, извините, это не помогает, пожалуйста, смотрите расширенный начальный вопрос для получения дополнительной информации. - person Steffen Mangold; 18.05.2015