Я использую стандартный шаблон MVC4 в VS 2012. Он пришел с _layout.cshtml файл, который выглядит следующим образом:Как подавить навигацию на домашней странице моего приложения MVC4?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title - iLoveSport</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width" />
@Styles.Render("~/Content/css")
@Styles.Render("~/Content/kendo")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/kendo")
@Scripts.Render("~/bundles/modernizr")
</head>
<body>
<header>
<div class="content-wrapper">
<div class="float-left">
<img src="~/Images/logo.png" alt="ILoveSport Logo" />
</div>
<div class="float-right">
<section id="login">
</section>
<nav>
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("AFL", "Index", "AFL")</li>
<li>@Html.ActionLink("NRL", "Index", "NRL")</li>
<li>@Html.ActionLink("State of Origin", "Index", "State of Origin")</li>
<li>@Html.ActionLink("Cricket", "Index", "Cricket")</li>
<li>@Html.ActionLink("Golf", "Index", "Gof")</li>
<li>@Html.ActionLink("Motorsport", "index", "Motorsport")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
</nav>
</div>
</div>
</header>
<div id="body">
@RenderSection("featured", required: false)
<section class="content-wrapper main-content clear-fix">
@RenderBody()
</section>
</div>
<footer>
<div class="content-wrapper">
<div class="float-left">
</div>
</div>
</footer>
@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
</html>
_viewstart.cshtml содержит следующее:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Что должны быть изменены так, чтобы на моей странице _layout.cshtml навигация была отключена только на домашней странице? На домашней странице должна быть кнопка, которая затем запускает внутреннюю страницу, которая в настоящее время является моей домашней страницей. Создать новый файл макета, подавляющий меню и изменить viewstart, чтобы загрузить его? Или это может быть сделано другим способом?
Благодарим за помощь и руководство.
Обновление:
My Home Controller теперь следующим образом:
[ChildActionOnly]
public ActionResult NavigationMenu()
{
string controller = ControllerContext.
ParentActionViewContext.RouteData.Values["controller"].ToString();
string action = ControllerContext.
ParentActionViewContext.RouteData.Values["action"].ToString();
if (controller == "Home" && action == "Index")
return Content("");
else
return PartialView("_Menu");
}
Мой _layout.cshtml выглядит следующим образом:
<nav>
@Html.Action("NavigationMenu","Partial")
</nav>
Однако я получаю ошибку отладки с указанием:
System.Web.HttpException: The controller for path '/' was not found or does not implement IController.
Эта ошибка возникает в файле layout.cshtml. Как это можно исправить?
Должен ли метод действия быть помещен в Домашний контроллер или в новый MenuController? – SidC
В вашем случае я думаю, что имеет смысл разместить его под домашним контроллером, поскольку он не будет использоваться, кроме вашей домашней страницы. –
Поскольку вы имеете дело с представлениями, я не понимаю, почему вам нужно сделать дочернее действие только для этого. Это будет так же просто иметь инструкцию if в файле макета, чтобы использовать соответствующее частичное представление. Однако вы должны решить, что определяет домашнюю страницу. Корневой URL (~ /) или контроллер/действие (Главная/Индекс), из-за маршрутизации двух, могут не совпадать. '@if (ViewContext.RouteData.Values [" Controller "] ==" Home "&& ViewContext.RouteData.Values [" Action "] ==" Index ") {@ Html.Partial (" NavMenu ")}' или '@if (Request.Url.AbsolutePath =="/") {@ Html.Partial (" NavMenu ")}' –