Заставить все области использовать один и тот же макет

У меня есть следующая структура проекта:

  • /Views/Shared/_layout;

  • /Районы/Area1/Views/ControllerName/Index;

...

  • /Areas/Arean/Views/ControllerName/Index.

Есть ли способ заставить все области использовать _Layout в качестве основного макета ?

Есть ли способ сделать это без добавления файла _ViewStart (например, через конфигурацию маршрутизации)?

См. также:

Как указать различные макеты в файле ViewStart бритвы ASP.NET MVC 3?

Ответ 1

Вам просто нужно добавить файл с именем:

_ViewStart.cshtml

Под каждой областью отображает папку:

/Areas/Area1/Views/_ViewStart.cshtml

И отредактируйте файл, чтобы указать на корневой макет, например:

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

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

Примечание. Как упоминал Тони, вы можете отредактировать каждое свойство макета вида, чтобы указать на корневой макет, однако это не рекомендуется для этого, поскольку вы будете связывать свои представления с макетом и изменить это было бы больно

Изменить 1

Если вы хотите использовать код для установки макета представления по умолчанию, возможно, вам стоит рассмотреть возможность создания настраиваемого механизма просмотра.

Попробуйте google о пользовательских RazorViewEngine и RazorView

Эта статья может стать хорошей отправной точкой

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

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

Ответ 2

Расширение ответа Юпаола....

По крайней мере, в VS2013 файл _ViewStart.cshtml добавляется по умолчанию при создании области, поэтому он уже существует, и вы можете изменить содержимое, как он отмечает, чтобы указать на корень _Layout.cshtml. Затем вы можете удалить _Layout.cshtml в этой области, поскольку он больше не используется (и потенциальный источник путаницы сейчас)

Однако при этом любая маршрутизация, выполняемая в этом корневом _Layout.cshtml, должна будет учитывать области.
По умолчанию _Layout.cshtml содержит несколько помощников ActionLink, которые нуждаются в небольшой модификации:

Добавьте параметр RouteValueDictionary к любым вызовам ActionLink, установив Area = "". Обратите внимание: пустая строка относится к корневому уровню. Это позволит корректно работать с этими ссылками при вызове из области, все еще работающей при вызове из корня.

например:.

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>

Ответ 3

Вы определяете макет, используя:

@{   Макет = "_Layout"; }

Если вы хотите, чтобы это было проще изменить все сразу. Возможно, вы могли бы просто установить его как переменную сумку просмотра и передать ее на контроллер. Чтобы сделать это еще проще, вы можете создать базовый контроллер, на который наследуются другие контроллеры, и назначить ему макет для мешка просмотра.

Не уверен, почему маршрутизация должна измениться или, может быть, я не понимаю. Надеюсь, это поможет:)