MVC 5路由问题-多条路由错误地瞄准同一个视图
本文关键字:路由 同一个 视图 错误 问题 MVC | 更新日期: 2023-09-27 18:04:07
我配置了多条路由,但由于某种原因,尽管规则针对不同的控制器和不同的视图,但不同的链接路由到同一个视图。请参阅下面,我已经包含了我的routecconfig文件和示例链接如下:
RouteConfig.cs
using System.Web.Mvc;
using System.Web.Routing;
namespace WebApplication1
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Account",
url: "Account/{action}/{id}",
defaults: new { controller = "Account", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Member",
url: "Member/{action}/{id}",
defaults: new { controller = "Member", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Root",
url: "{action}/{id}",
defaults: new { controller = "Home", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Details",
url: "{controller}/{action}/{u}",
defaults: new
{
controller = "Member",
action = "Details",
u = UrlParameter.Optional
}
);
routes.MapRoute(
name: "Article",
url: "{Home}/{Article}/{id}/{articleName}",
defaults: new { controller = "Home", action = "Article" }
);
routes.MapRoute(
name: "Item",
url: "{News}/{Item}/{id}/{itemName}",
defaults: new { controller = "News", action = "Item" }
);
}
}
}
与
http://localhost:11508/Home/Article/2/Participate
http://localhost:11508/News/Item/2/Second-Test
可以看到,链接和规则肯定是唯一的,但是由于某种原因Item规则被忽略了,它只是将Id 2传递给Home/Article视图。
您不应该在括号中包含控制器/操作名称-只需按原样传递它们,以便路径可以匹配。最后两个路由应该是这样的:
routes.MapRoute(
name: "Article",
url: "Home/Article/{id}/{articleName}",
defaults: new { controller = "Home", action = "Article" }
);
routes.MapRoute(
name: "Item",
url: "News/Item/{id}/{itemName}",
defaults: new { controller = "News", action = "Item" }
);
同样,最好将此类特定路由放在任何其他路由之前,而不是放在默认路由之后。
基本上这应该是一个单独的问题,但在这里回答更容易。
从评论:如何将
http://localhost:11508/Member/Details?u=testuser
路由到http://localhost:11508/Member/Details/testuser
而不是显示参数。
创建接受此参数的控制器动作,如下所示:
public ActionResult Details(string u, ...) { var model = new ... ... return View(model); }
注册路由,接受
u
参数作为URL部分,如下所示routes.MapRoute( name: "MyRoute", url: "Member/Details/{u}", defaults: new { controller = "Member", action = "Details", u = UrlParameter.Optional } );
这里
{u}
实际上声明了参数名称,以及它应该如何在URL中使用(解析/渲染)。像这样呈现URL链接:
<a href="@Url.Action("Details", "Member", new {u = "testuser"})">linktext</a>
在所有这些步骤中,u
是您将使用的参数名称。
Mapping采用第一个匹配规则。"Item"-Route永远不会被使用,因为Article-Root会捕获所有与"Item"-Route匹配的请求。检查路由的顺序,并删除{}周围的新闻
routes.MapRoute(
name: "Item",
url: "News/Item/{id}/{itemName}",
defaults: new { controller = "News", action = "Item" }
);
您的问题在于您注册路由的顺序。规则是,您应该从最具体到最不具体地注册它们。换句话说,你的"默认"路由应该是最后一个。
你现在如何拥有它,MVC得到你的默认路由命中,因为你的item
路由匹配,所以一旦它命中,它停止寻找其他路由并使用它。
移动你的item
路由到你的RegisterRoutes
方法的顶部,它应该工作良好