qua*_*els 3 asp.net asp.net-mvc routing asp.net-mvc-2
我正在尝试将当前路径导入我的导航控制器,以便在填充导航菜单数据时运行比较.
我的链接对象是这样的:
public class StreamNavLinks
{
public string Text { get; set; }
public RouteValueDictionary RouteValues { get; set; }
public bool IsSelected { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在母版页中,我试图将当前路径传递给导航控制器,如下所示:
<% Html.RenderAction(
"MenuOfStreamEntries", // action
"Nav", // controller
new { // parameters for action
currentStreamUrl = "Blog",
currentRoute = ViewContext.RouteData } // get route data to compare in controller
); %>
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我无法弄清楚如何获取任何数据currentRoute.获取价值的最佳方法是什么currentRoute?
我试过这样的语法:
currentRoute.Values.routevaluename
Run Code Online (Sandbox Code Playgroud)
和
currentRoute.Values[0]
Run Code Online (Sandbox Code Playgroud)
但我似乎无法让它发挥作用.
我也尝试将此代码放入导航控制器的操作中:
var current = RouteData["streamUrl"];
Run Code Online (Sandbox Code Playgroud)
和
var current = this.RouteData["streamUrl"];
Run Code Online (Sandbox Code Playgroud)
两个版本都给我这个错误:
错误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" }
);
Run Code Online (Sandbox Code Playgroud)
因此,最终mydomain.com/blog/blogentry1将映射到与mydomain.com/pages/welcome相同的控制器/操作.我不是在寻找控制器值或动作值,而是在寻找streamUrl值和EntryUrl值.
Dar*_*rov 13
您不需要将路由数据传递给控制器,因为控制器已经通过RouteData属性了解它:
public ActionResult Index() {
// You could use this.RouteData here
...
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您想传递一些简单的参数,例如用于渲染视图的当前操作,您可以执行以下操作:
<%= Html.RenderAction(
"MenuOfStreamEntries",
"Nav",
new {
currentStreamUrl = "Blog",
currentAction = ViewContext.RouteData.Values["action"],
currentController = ViewContext.RouteData.Values["controller"]
}
); %>
Run Code Online (Sandbox Code Playgroud)
在你的控制器中:
public ActionResult Nav(string currentAction, string currentController)
{
...
}
Run Code Online (Sandbox Code Playgroud)
摘自这篇好文章。
创建自定义扩展方法:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
您的 HTML 标记:
<div id="menucontainer">
<ul id="menu">
<%= Html.ActionMenuItem("Home", "Index", "Home") %>
<%= Html.ActionMenuItem("About", "About", "Home") %>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
<div id="menucontainer">
<ul id="menu">
<li class="selected"><a href="/">Home</a></li>
<li><a href="/Home/About">About</a></li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22509 次 |
| 最近记录: |