【问题标题】:ASP.NET routes not triggering as I expectASP.NET 路由未按我预期触发
【发布时间】:2016-01-19 16:51:21
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

  • type 不是t。将方法更改为ActionResult Index(String Type) 或将链接参数更改为new { t = "blablabla" }(在这种情况下,路由需要是`url:“{controller}/{action}/{t}”,

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


【解决方案1】:

我认为参数需要与路由中的名称相同: 类型而不是 id。

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

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

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

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

【讨论】:

  • 我要添加第三点:使 ImproItem 路由特定于其控制器。目前,它会捕获其他控制器调用,一旦您完成第一点,就会破坏默认路由目的。 ImproItem 的 Url 应更改为:url: "ImproItemForm/{action}/{type}"
  • 感谢 Nirman 和 Frédéric 的帮助,我现在很清楚 :)
【解决方案2】:

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

public ActionResult Index(String type)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 2017-03-15
    • 2021-10-14
    • 1970-01-01
    • 2014-05-02
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多