ASP.NET MVC中关于路由的一些基本问题

Some basic questions about Routing in ASP.NET MVC

我正在尝试学习 ASP.NET MVC,有几个关于路由的问题。

Print 是一个控制器,具有 Show 操作,它接受一个参数,return 将其作为字符串返回。

考虑代码

  public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });

        routes.MapRoute(
          name: "Print",
          url: "Print/{action}/{id}",
           defaults:  new { controller = "Print", action = "Show", id = UrlParameter.Optional });


    }

为什么我尝试 host:xxxxx/Print/xxx... 时会收到 404 错误?它不应该带我去 Show 行动吗?

另外,如果我设置 url:Print,然后尝试 host:xxxxx/Print,我也会得到同样的错误。它应该带我去 Show 行动。

类似地,如果我设置 url:Print/{action}/{id} 并尝试 host:xxxxx/Print/Show 它会给出相同的错误,即使该参数是可选的,并且 return 应该为空吗?

但是,如果我交换两条路线,使 Print 路线优先,Home/Index 优先,在任何情况下我都不会收到任何错误? host:xxxxx/Print 显示空白,host:xxxxx/Print/Show 显示空白,host:xxxxx/Print/Show/xxx... return 一些值。

为什么设置为第二条路由会报错?

将路由注册顺序更改为:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Print",
        url: "Print/{action}/{id}",
        defaults: new { controller = "Print", action = "Show", id = UrlParameter.Optional });

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

RegisterRoutes() 中的路由按添加到 routes 的顺序进行分析。 Default 路由模式是通用的,因此第二个路由模式不起作用。 MVC 试图在 Home 控制器中找到 Show 操作,但没有找到。因此它报告 404 错误。

如果查看 RouteCollection 声明,它是从 IList<T> 继承的。因此,分析的路线是按顺序添加到路线 table.

您的任何路线都应添加到 Default 路线之前。