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
路线之前。
我正在尝试学习 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
路线之前。