簡體   English   中英

在ASP.NET MVC 2中 - 如何將路由值導入導航控制器,以便突出顯示當前鏈接?

[英]In ASP.NET MVC 2 - How do I get Route Values into my navigation controller so I can highlight the current link?

我正在嘗試將當前路徑導入我的導航控制器,以便在填充導航菜單數據時運行比較。

我的鏈接對象是這樣的:

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

您不需要將路由數據傳遞給控制器​​,因為控制器已通過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) 
{
    ...
}

摘自這篇好文章

創建自定義擴展方法:

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>

這是我們為做類似事情而編寫的示例方法。

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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM