路由配置在我的URL中查找id

时间:2016-12-09 18:52:37

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

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

的问题

我将路线修改为我的太空控制器,使其看起来像这样

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

这样我就有了一条更干净的路线,当用户想要查看空格时,网址将如下所示

  

www.mysite /空间/ 12345

我现在遇到的问题是我的JS文件调用这样的.load(),其中spaceoverview是我的行为

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

我收到错误说

  

参数字典包含参数' id'的空条目。非可空类型的System.Int32' for method' System.Web.Mvc.ActionResult Index(Int32)'在' YogaBandy2017.Controllers.SpaceController'。可选参数必须是引用类型,可空类型,或者声明为可选参数。   参数名称:参数

所以我必须在这个网址之后输入一个id,这不是我想要的,或者对我来说不合适

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用参数约束来过滤掉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 }
);

第一条路线将抓住你的

  

/空间/ 12345

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

  

/空间/ SpaceOverview

示例,因为SpaceOverview没有。

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

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

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

答案 1 :(得分:0)

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

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