ASP.NET路由不像我期望的那样触发

时间:2016-01-19 16:51:22

标签: asp.net asp.net-mvc razor html.actionlink

尝试开始使用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>

这对我来说很好看。 但是,此链接正确调用控制器的操作(使用ImproItem路由),但它不传递blablabla参数。调试应用程序时参数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。

提前帮助你。

2 个答案:

答案 0 :(得分:2)

  

我认为参数需要与路径中的名称相同:   输入而不是id。

实际上,当您请求URL - http://localhost:55193/ImproItemForm/Index?id=foobar时,它实际上只调用默认路由,而不是您创建的自定义路由。默认路由有 - 控制器名称,操作名称和ID。这意味着,如果有任何匹配此模式的URL(即{controllername} / {actionname} / {id})将匹配默认路由。

路由顺序在路由收集中非常重要,因为路由表是从上到下构建的,因此只要URL找到其第一个匹配路由,它就会停止进一步扫描。理想情况下,默认路由应该是最底层的路线收集路线。

我想这个特定场景的所有问题都应该通过执行以下两个步骤来解决 -

  1. 将默认路由移至RouteConfig.cs
  2. 中路由集合的底​​部
  3. 在“索引”操作中将参数“t”重命名为“type”。

答案 1 :(得分:1)

更改操作中参数的名称以匹配ActionLink

中的名称
public ActionResult Index(String type)