MVC 5路由问题 - 多个路由错误地针对相同的视图

igg*_*web 6 c# url-routing asp.net-mvc-5

我配置了多个路由,但由于某些原因,尽管规则处理不同的控制器和不同的视图,但不同的链路路由到同一视图.请看下面,我已经包含了我的RouteConfig文件和下面的示例链接:

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" }
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

链接

http://localhost:11508/Home/Article/2/Participate
http://localhost:11508/News/Item/2/Second-Test
Run Code Online (Sandbox Code Playgroud)

可以看出,链接和规则肯定是唯一的,但由于某种原因,Item规则被忽略,它只是将Id 2传递给Home/Article视图.

Lan*_*kin 1

您不应在括号中包含控制器/操作名称 - 只需按原样传递它们,以便可以匹配路径。您的最后两条路线应如下所示:

        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" }
        );
Run Code Online (Sandbox Code Playgroud)

此外,最好将此类特定路由放置在任何其他路由之前,而不是默认路由之后。

更新

基本上它应该是一个单独的问题,但在这里回答会更容易。

来自评论:

我如何能够http://localhost:11508/Member/Details?u=testuser被路由到http://localhost:11508/Member/Details/testuser而不是显示参数。

  1. 创建接受此参数的控制器操作,如下所示:

    public ActionResult Details(string u, ...)
    {
        var model = new ...
        ...
        return View(model);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 注册路由,它接受u参数作为 URL 部分,就像这个

        routes.MapRoute(
            name: "MyRoute",
            url: "Member/Details/{u}",
            defaults: new { controller = "Member", action = "Details", u = UrlParameter.Optional }
        );
    
    Run Code Online (Sandbox Code Playgroud)

    这里{u}实际上声明了参数名称,以及如何在 URL 中使用(解析/渲染)它。

  3. 渲染到 URL 的链接如下所示:

    <a href="@Url.Action("Details", "Member", new {u = "testuser"})">linktext</a>
    
    Run Code Online (Sandbox Code Playgroud)

在所有这些步骤中,u是您将使用的参数名称。