[英]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
知道我想要匹配的路由值也可能有所幫助:
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.