Изменить макет (главная страница) представления в 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;
}