【问题标题】:Route configuration looking for an id in my URL在我的 URL 中查找 id 的路由配置
【发布时间】:2016-12-09 18:52:36
【问题描述】:

如何更正路由以解决 ajax .load() 的问题

我修改了到我的空间控制器的路线,使其看起来像这样

routes.MapRoute(
            name: "SpaceCleanRoute",
            url: "Space/{id}",
            defaults: new { controller = "Space", action = "Index" }
        );

这样我就有了更清晰的路线,当用户想要查看空间时,URL 将如下所示

www.mysite/space/12345

我现在遇到的问题是当我的 JS 文件像这样调用 .load() 时,其中 spaceoverview 是我的操作

$("#partialPageContainer").load('/Space/SpaceOverview', function (response, status, xhr) {
        alert("Load was performed.");
    });

我收到一个错误提示

参数字典包含“YogaBandy2017.Controllers.SpaceController”中方法“System.Web.Mvc.ActionResult Index(Int32)”的不可为空类型“System.Int32”的参数“id”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。 参数名称:参数

所以我必须在这样的 url 后面加上一个 id,这不是我想要的,或者对我来说似乎不合适

我该如何解决这个问题,或者这就是路由的工作原理?我对使用 ASP.Net 的 mvc 路由有点陌生

$("#partialPageContainer").load('/Space/SpaceOverview/1', function (response, status, xhr) {
        alert("Load was performed.");
    });

已更新 - 我想现在我将使用 '/space/actionname/1' 连接到每个操作,直到找到更好的解决方案。

【问题讨论】:

  • 您是否尝试过先将 id 和 nullable 设置为可空,以确保它走在正确的路线上?
  • 我不确定你的意思。你能举个例子吗?如果我使用 url '/space/spaceoverview/{id}' 那么它可以工作,其中 id 是任何数字。如果我不使用 id ,则会引发异常并且永远不会进入该操作。这似乎不对,我想知道是否有办法做到这一点,这样我就不必输入 id 来加载?
  • '/Space/SpaceOverview 表示您调用SpaceControllerIndex() 方法(由您的路线定义)并将文本“SpaceOverview”传递给int id 参数(这当然会失败并且idnull - 因此例外)。如果您想点击SpaceOverview() 方法,那么您需要删除该路由定义,或者在SpaceCleanRoute 路由之前为每个方法创建特定路由,或者添加约束以确保第二段是int跨度>

标签: c# ajax asp.net-mvc routes routeconfig


【解决方案1】:

您可以使用参数约束来过滤掉id 参数的字符串值。

routes.MapRoute(
    name: "SpaceCleanRoute",
    url: "Space/{id}",
    defaults: new { controller = "Space", action = "Index" }
    constraints: new { id = @"\d+" }
);

然后你需要设置你的默认路由来处理不符合该约束的事情:

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

第一条路线会赶上你的

/Space/12345

例如,因为 12345 匹配 @"\d+" 模式,但是第二条路由将处理您的

/Space/SpaceOverview

例如,因为SpaceOverview 没有。

您可以在此处找到更多信息和路由限制示例:https://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

编辑:我相信您也可以使用其中一个内置的路由约束(这可能会更好,因为从技术上讲,一个值可以匹配 @"\d+" 模式但仍然不是有效的 int),如下所示:

routes.MapRoute(
    name: "SpaceCleanRoute",
    url: "Space/{id}",
    defaults: new { controller = "Space", action = "Index" }
    constraints: new { id = new System.Web.Http.Routing.Constraints.IntRouteConstraint()}
);

【讨论】:

    【解决方案2】:

    如果你想发送动作参数试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-26
      • 2014-04-15
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 2019-07-30
      • 2012-02-16
      相关资源
      最近更新 更多