2013-05-15 2 views
0

Я использую стандартный шаблон 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. Как это можно исправить?

ответ

1

Вы можете определить свое навигационное меню как частичное представление. И сделайте этот частичный вид в своем макете.

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

Частичный вид

<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> 

Действие Метод

[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("_NavigationPartial"); 
} 

Rendering Частичный вид

@Html.Action("NavigationMenu", "Partial") 

Я не тестировал код, но большая часть его должна быть прекрасной.

+0

Должен ли метод действия быть помещен в Домашний контроллер или в новый MenuController? – SidC

+0

В вашем случае я думаю, что имеет смысл разместить его под домашним контроллером, поскольку он не будет использоваться, кроме вашей домашней страницы. –

+0

Поскольку вы имеете дело с представлениями, я не понимаю, почему вам нужно сделать дочернее действие только для этого. Это будет так же просто иметь инструкцию if в файле макета, чтобы использовать соответствующее частичное представление. Однако вы должны решить, что определяет домашнюю страницу. Корневой URL (~ /) или контроллер/действие (Главная/Индекс), из-за маршрутизации двух, могут не совпадать. '@if (ViewContext.RouteData.Values ​​[" Controller "] ==" Home "&& ViewContext.RouteData.Values ​​[" Action "] ==" Index ") {@ Html.Partial (" NavMenu ")}' или '@if (Request.Url.AbsolutePath =="/") {@ Html.Partial (" NavMenu ")}' –

Смежные вопросы