【问题标题】:MVC Routing Html.ActionLink creates URLs with ?id=1 instead of /idMVC 路由 Html.ActionLink 使用 ?id=1 而不是 /id 创建 URL
【发布时间】:2012-01-04 02:37:22
【问题描述】:

当我使用 Html.ActionLink() 时,创建的 URL 不是所需的格式:

Html.ActionLink(Model.ProductCode, "Update", new { id = Model.ProductId })

制作这个网址

/Update?id=1

当我想要这个网址时:

/Update/1

哪些路由选项会创建第二个 URL?这是我们首选的 URL 样式。

两个 URL 都有效并且显示了正确的页面 - 但是我们只想使用 /id

在 Global.asax 中,MVC 默认路由处理两个 URL

routes.MapRoute(
    "Default",                                               // Route name
    "{controller}/{action}/{id}",                            // URL with parameters
    new { controller = "Home", action = "Index", id = "" }); // Parameter defaults

【问题讨论】:

  • 你有匹配的路线吗?
  • 你能在 global.asax 中发布路线吗?
  • 两条路线目前都有效。我只希望 ActionLink 以我们的首选格式生成 URL。
  • 只是为了确定......您的控制器操作是否指定了一个名为“id”的参数?
  • @JK Global.asax 文件中的路由声明可能存在一些问题。能否请您发布 Global.asax 文件的内容,以便我们进一步调查?

标签: asp.net-mvc url asp.net-mvc-routing


【解决方案1】:

我可以通过一条关于我的默认路由的路由来复制该问题,该路由仍与一般模式匹配。示例:

routes.MapRoute(
                            "Default2", // Route name
                            "{controller}/{action}", // URL with parameters
                            new { controller = "Home", action = "Index"} // Parameter defaults
                        );

当位置高于我的默认路由时,我会在我的 URL 中获得 ?id=1。您能否确认此 ActionLink 与您期望它匹配的路由之上的任何路由都不匹配?

编辑:以下内容不会影响 URL

但是,在其他情况下使用 UrlParameter.Optional 仍然是有利的。除非暴民规则另有规定,否则离开是为了繁荣。

新的 UrlParameter.Optional 值。如果您将默认值设置为 此特殊值的 URL 参数,MVC 确保删除该键 从路由值字典中,使其不存在。

我认为您需要稍微调整路线。将 id = "" 更改为 id = UrlParameter.Optional

routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional });

这是我们用于默认路由的内容,您正在寻找的行为就是我们的应用程序的行为方式。

【讨论】:

  • JK - 我刚刚验证了自己,同时查看是否可以让我的 MVC 应用程序创建一个?使用网址。 MVC 可以匹配的默认路由之上是否还有其他路由?是否可以查看您的整个路由表?
【解决方案2】:

This question/answer

您使用的是哪个版本的 MVC?如果您在 MVC3 中,则需要在对 Html.ActionLink() 的调用中添加第四个参数,传入 null

【讨论】:

    【解决方案3】:

    我刚刚偶然发现并决定回答。事实证明,Url.Action() 和 Html.ActionLink() 都使用路由集合中的第一个路由来格式化结果 URL。因此,RegisterRoutes() 中的第一个映射路由应该是:

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

    而不是“{controller}/{action}/{id}”。路线名称(即“默认”)无关紧要,重要的是顺序

    【讨论】:

      【解决方案4】:
      routes.MapRoute(
                      name: "Default",
                      url: "{controller}/{action}/{id}",
                      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                  );
      

      【讨论】:

        猜你喜欢
        • 2013-03-14
        • 2019-07-18
        • 1970-01-01
        • 2014-08-16
        • 2015-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多