Изменить макет (мастер-страницу) представления в ASP.NET MVC без его повторного создания - PullRequest
42 голосов
/ 15 декабря 2011

Я использую ASP.NET MVC 3 с видами Razor. Если вы хотите создать вид, вы можете выбрать макет (главную страницу) для своего вида или оставить его, чтобы выбрать Default (_Layout).

Мне интересно изменить этот макет после создания вида без его воссоздания, есть ли место для хранения информации макета о видах? и как я могу это изменить?

Ответы [ 4 ]

66 голосов
/ 15 декабря 2011

В MVC3 у вас есть _ViewStart.cshtml, в котором хранится макет всех страниц; вы можете изменить этот элемент, чтобы изменить макет всех страниц, или вы можете добавить новый элемент макета в верхней части целевых страниц в блоке @{}, как показано ниже, чтобы изменить макет конкретной страницы:

@{
    Layout = "~/Views/Shared/_newLayout.cshtml";
    ViewBag.Title = "Index";
}
21 голосов
/ 15 декабря 2011

После создания вашего представления в верхней части файла cshtml вы можете увидеть свой макет в комплекте.

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

Вы можете просто заменить его, например, на другой макет

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

Кроме того, вы можете сохранить это в базовом макете (_ViewStart.cshtml), и тогда все ваши представления будут использовать этот макет.

18 голосов
/ 12 августа 2015

Существует несколько способов указать другой макет для представления в зависимости от ваших потребностей:

В представлении

Как упоминалось в других ответах, просто измените свойство представления Layout:

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

В _ViewStart.cshtml

MVC 3 добавлено значение по умолчанию Views/_ViewStart.cshtml, в которое можно поместить логику, которая является общей для всех представлений.Вы также можете создать дополнительные файлы _ViewStart.cshtml в любом подкаталоге Views для дополнительной пользовательской логики (она будет искать иерархию и в папках Shared, как при поиске любого другого представления или части).

Установкамного бизнес-логики в этом ощущается как нарушение принципа «разделения интересов», но в то же время это может быть очень удобно.

Обратите внимание, что _ViewStart.cshtml наследуется от StartPage , а не WebPage , поэтому его свойства могут немного отличаться от того, к чему вы привыкли (например, вам нужно пройти через ViewContext, чтобы получить ViewBag).

@{
    if (ViewContext.ViewBag.IsAdmin) // or other custom logic
    {
        Layout = "~/Views/Shared/_AdminLayout.cshtml";
    }
    else
    {
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
}

В действии Controller

Метод View() имеет перегрузку, которая принимает явную страницу макета (Intellisense именует ее «главной страницей»):

    public ActionResult FooAction()
    {
        var model = new MyModel();

        return View("Index", "_CustomLayout", model);
    }
7 голосов
/ 28 марта 2014

Мы можем изменить рендеринг макетов по умолчанию в файле _ViewStart, используя следующий код:

@{
 var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();

 string layout = "";
 if (controller == "Admin")
 {
 layout = "~/Views/Shared/_AdminLayout.cshtml";
 }
 else
 {
 layout = "~/Views/Shared/_Layout.cshtml";
 }

 Layout = layout;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...