Изменить макет (главная страница) представления в ASP.NET MVC без повторного создания

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

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

Ответ 1

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

@{
    Layout = "~/Views/Shared/_newLayout.cshtml";
    ViewBag.Title = "Index";
}

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Как уже упоминалось в других ответах, просто измените представление 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";
    }
}

В действии контроллера

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

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

        return View("Index", "_CustomLayout", model);
    }

Ответ 4

Мы можем изменить рендеринг макетов по умолчанию в файле _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;
}