ASP.NET 路由未按预期触发
ASP.NET routes not triggering as I expect
尝试开始使用 ASP.NET MVC。
我在设置基本路线时遇到了一些困难。
我的路线如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "ImproItem",
url: "{controller}/{action}/{type}",
defaults: new { controller = "ImproItemForm", action = "Index", type = UrlParameter.Optional }
);
}
我的观点是:
<li>@Html.ActionLink("linkLabel", "Index", "ImproItemForm", new { type = "blablabla" }, null)</li>
我的控制器动作信号是:
public class ImproItemFormController : Controller
{
...
public ActionResult Index(String t)
{
...}
}
视图生成以下内容HTML:
<li><a href="/ImproItemForm?type=blablabla">linkLabel</a></li>
我觉得还不错。
然而,这个 link 正确地调用了控制器的动作(使用 ImproItem 路由)但它没有传递 blablabla 参数。调试app时的参数t = null.
你能解释一下为什么吗?
我应该更改什么才能正确接收 blablabla 参数?
现在,如果我启动应用程序并尝试浏览
另外我浏览的时候是不是正常:
http://localhost:55193/ImproItemForm/Index?id=foobar
它确实调用了 ImproItemFormController.Index(String t) 方法?
没想到这个URL会匹配这条路由:
routes.MapRoute(
name: "ImproItem",
url: "{controller}/{action}/{type}",
defaults: new { controller = "ImproItemForm", action = "Index", type = UrlParameter.Optional }
);
我认为参数需要与路由中的名称相同:type 而不是 id。
提前感谢您的帮助。
更改操作中的参数名称以匹配 ActionLink
中的名称
public ActionResult Index(String type)
I thought the argument needs to have the same name than in the route :
type and not id.
实际上,当您请求 URL - http://localhost:55193/ImproItemForm/Index?id=foobar 时,它实际上只调用默认路由,而不是您创建的自定义路由。默认路由有 - 控制器名称、操作名称和 ID。这意味着,如果有任何 URL 匹配此模式(即 {controllername}/{actionname}/{id})将匹配默认路由。
路由的顺序在路由收集中非常重要,因为路由table是构建top-to-bottom的,所以一旦URL找到它的第一个匹配路由,它就会停止扫描further.So 理想情况下,默认路由应该是路由集合中最底部的路由。
我想您在这个特定场景中遇到的所有问题都应该通过执行以下两个步骤来解决-
- 在 RouteConfig.cs
的路由集合中将默认路由移至底部
- 在索引操作中将参数 "t" 重命名为 "type"。
尝试开始使用 ASP.NET MVC。
我在设置基本路线时遇到了一些困难。
我的路线如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "ImproItem",
url: "{controller}/{action}/{type}",
defaults: new { controller = "ImproItemForm", action = "Index", type = UrlParameter.Optional }
);
}
我的观点是:
<li>@Html.ActionLink("linkLabel", "Index", "ImproItemForm", new { type = "blablabla" }, null)</li>
我的控制器动作信号是:
public class ImproItemFormController : Controller
{
...
public ActionResult Index(String t)
{
...}
}
视图生成以下内容HTML:
<li><a href="/ImproItemForm?type=blablabla">linkLabel</a></li>
我觉得还不错。 然而,这个 link 正确地调用了控制器的动作(使用 ImproItem 路由)但它没有传递 blablabla 参数。调试app时的参数t = null.
你能解释一下为什么吗? 我应该更改什么才能正确接收 blablabla 参数?
现在,如果我启动应用程序并尝试浏览
另外我浏览的时候是不是正常: http://localhost:55193/ImproItemForm/Index?id=foobar 它确实调用了 ImproItemFormController.Index(String t) 方法? 没想到这个URL会匹配这条路由:
routes.MapRoute(
name: "ImproItem",
url: "{controller}/{action}/{type}",
defaults: new { controller = "ImproItemForm", action = "Index", type = UrlParameter.Optional }
);
我认为参数需要与路由中的名称相同:type 而不是 id。
提前感谢您的帮助。
更改操作中的参数名称以匹配 ActionLink
public ActionResult Index(String type)
I thought the argument needs to have the same name than in the route : type and not id.
实际上,当您请求 URL - http://localhost:55193/ImproItemForm/Index?id=foobar 时,它实际上只调用默认路由,而不是您创建的自定义路由。默认路由有 - 控制器名称、操作名称和 ID。这意味着,如果有任何 URL 匹配此模式(即 {controllername}/{actionname}/{id})将匹配默认路由。
路由的顺序在路由收集中非常重要,因为路由table是构建top-to-bottom的,所以一旦URL找到它的第一个匹配路由,它就会停止扫描further.So 理想情况下,默认路由应该是路由集合中最底部的路由。
我想您在这个特定场景中遇到的所有问题都应该通过执行以下两个步骤来解决-
- 在 RouteConfig.cs 的路由集合中将默认路由移至底部
- 在索引操作中将参数 "t" 重命名为 "type"。