В ASP.NET MVC 2 - Как я могу получить значения маршрутов в моем контроллере навигации, чтобы я мог выделить текущую ссылку? - PullRequest
3 голосов
/ 07 сентября 2010

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

Мой объект ссылок выглядит следующим образом:

public class StreamNavLinks
{
    public string Text { get; set; }
    public RouteValueDictionary RouteValues { get; set; }
    public bool IsSelected { get; set; }
}

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

<% Html.RenderAction(
    "MenuOfStreamEntries", // action
    "Nav", // controller
    new { // parameters for action
        currentStreamUrl = "Blog", 
        currentRoute = ViewContext.RouteData } // get route data to compare in controller
); %>

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как получитьлюбые данные из currentRoute.Каков наилучший метод для получения значений или currentRoute?

Я пробовал синтаксис, как это:

 currentRoute.Values.routevaluename

и

 currentRoute.Values[0]

Но яне могу заставить его работать.

Редактировать

Я также пытался поместить этот код в действие контроллера навигации:

var current = RouteData["streamUrl"];

и

var current = this.RouteData["streamUrl"];

Обе версии дают мне эту ошибку:

Ошибка 1 Не удается применить индексирование с помощью [] к выражению> типа 'System.Web.Routing.RouteData' C: \ pathtocontroller\ NavController.cs 25 27

Изменить 2

Также может быть полезно узнать значения маршрута, с которыми я пытаюсь сопоставить:

        routes.MapRoute(null, "", // Only matches the empty URL (i.e. ~/)
                        new
                        {
                            controller = "Stream",
                            action = "Entry",
                            streamUrl = "Pages",
                            entryUrl = "HomePage"
                        }
        );

        routes.MapRoute(null, "{streamUrl}/{entryUrl}", // matches ~/Pages/HomePage
                        new { controller = "Stream", action = "Entry" }
        );

Таким образом, в конечном итоге mydomain.com/blog/blogentry1 будет отображаться на тот же контроллер / действие, что и mydomain.com/pages/welcome.Я не ищу значение контроллера или значение действия, скорее, я ищу значение streamUrl и значение EntryUrl.

Ответы [ 3 ]

13 голосов
/ 07 сентября 2010

Вам не нужно передавать данные маршрута в контроллер, потому что контроллер уже знает об этом через свойство RouteData:

public ActionResult Index() {
    // You could use this.RouteData here
    ...
}

Теперь, если вы хотите передать несколько простых аргументов, таких как текущее действие, которое использовалось для визуализации представления, вы можете сделать это:

<%= Html.RenderAction(
    "MenuOfStreamEntries",
    "Nav",
    new {
        currentStreamUrl = "Blog", 
        currentAction = ViewContext.RouteData.Values["action"],
        currentController = ViewContext.RouteData.Values["controller"]
    }
); %>

А в вашем контроллере:

public ActionResult Nav(string currentAction, string currentController) 
{
    ...
}
4 голосов
/ 07 сентября 2010

Взято из этой хорошей статьи .

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

public static class HtmlExtensions
{
    public static MvcHtmlString ActionMenuItem(this HtmlHelper htmlHelper, String linkText,
        String actionName, String controllerName)
    {
        var tag = new TagBuilder("li");

        if ( htmlHelper.ViewContext.RequestContext
            .IsCurrentRoute(null, controllerName, actionName) )
        {
            tag.AddCssClass("selected");
        }

        tag.InnerHtml = htmlHelper.ActionLink(linkText, actionName, controllerName).ToString();

        return MvcHtmlString.Create(tag.ToString());
    }
}

Ваша HTML-разметка:

<div id="menucontainer">

    <ul id="menu">
        <%= Html.ActionMenuItem("Home", "Index", "Home") %>
        <%= Html.ActionMenuItem("About", "About", "Home") %>
    </ul>

</div>

Производитследующий вывод:

<div id="menucontainer">

    <ul id="menu">
        <li class="selected"><a href="/">Home</a></li>
        <li><a href="/Home/About">About</a></li>
    </ul>

</div>
1 голос
/ 07 сентября 2010

Вот пример метода, который мы написали для выполнения чего-то подобного.

public static bool IsCurrentAction(this HtmlHelper helper, string actionName, string controllerName)
{
  string currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
  string currentActionName = (string)helper.ViewContext.RouteData.Values["action"];

  return currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) && currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase));
}
...