0

如何更正路由以解决 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' 连接到每个操作,直到找到更好的解决方案。

4

2 回答 2

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没有。

您可以在此处找到更多信息和路由约束示例: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()}
);
于 2016-12-10T01:07:52.300 回答
0

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

 routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
于 2016-12-10T00:04:23.020 回答