MVC 3 рендер меню - PullRequest
       3

MVC 3 рендер меню

2 голосов
/ 17 октября 2011

Для рендеринга моего меню в MVC 3 Razor у меня в контроллере Home есть действие меню: public ActionResult Menu () {...} Это действие получает пункты меню и отображает их, используя представление. В _Layout я использую: @ Html.Action («Меню», «Домой») для рендеринга меню. Это отлично работает.

Моя проблема в том, что я хочу выбрать текущий элемент. Для этого каждое действие, которое отображает элемент в меню, добавляет в ViewBag выбранный элемент меню. Проблема в том, что ViewBag пуст в действии Menu. Это правильный подход? Я хочу сделать меню, используя контроллер + представление, а не только представление. Я хочу этого, чтобы избежать наличия логического кода в коде представления и чтобы иметь возможность проверить его.

Знаете ли вы лучший подход?

Как передать данные из _Layout.cshtml в действие, которое я отображаю с помощью @ html.Action?

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Вы можете передать его как параметр:

@Html.Action("Menu", "Home", new { sleectedItem = (string)ViewBag.SomeItem })

, а затем в действии дочернего контроллера использовать это:

public ActionResult Menu(string selectedItem)
{
    ...
}

или, если вам нужно только выбрать текущий контроллер иДействие, которое вы можете просто получить эту информацию из RouteData и избавиться от любого ViewBag:

public ActionResult Menu()
{
    var rd = ControllerContext.ParentActionViewContext.RouteData;
    var action = rd.GetRequiredString("action");
    var controller = rd.GetRequiredString("controller");

    // Now that you know the action and the controller build up your view model 
    // and pass to the view. It will then know which menu item to preselect
    ...
}
1 голос
/ 17 октября 2011

Попробуйте создать RouteData изнутри метода действия или ViewContext, если внутри расширения HtmlHelper, при создании меню. Извлеките, какой контроллер является текущим, а какой - текущим действием, и установите соответствующий пункт меню.

Из метода действия:

object controller = RouteData.Values["controller"];
object action = RouteData.Values["action"];
object area = RouteData.DataTokens["area"];

От помощника html:

object controller = helper.ViewContext.RouteData.Values["controller"];
object action = helper.ViewContext.RouteData.Values["action"];
object area = helper.ViewContext.RouteData.DataTokens["area"];
0 голосов
/ 17 октября 2011

Вот помощник, который я недавно написал для печати класса css в активном меню: http://blog.tomasjansson.com/2010/09/asp-net-mvc-helper-for-active-tab-in-tab-menu/

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