在我的 URL 中寻找 id 的路由配置
Route configuration looking for an id in my URL
如何更正路由以解决 ajax .load()
的问题
我修改了通往 space 控制器的路线,使其看起来像这样
routes.MapRoute(
name: "SpaceCleanRoute",
url: "Space/{id}",
defaults: new { controller = "Space", action = "Index" }
);
这样我就有了一条更清晰的路线,当用户想要看到 space 时,URL 将看起来像这样
www.mysite/space/12345
我现在遇到的问题是当我的 JS 文件像这样调用 .load() 时,其中 spaceoverview 是我的操作
$("#partialPageContainer").load('/Space/SpaceOverview', function (response, status, xhr) {
alert("Load was performed.");
});
我收到一条错误消息
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Index(Int32)' in 'YogaBandy2017.Controllers.SpaceController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters
所以我必须像这样在url后面放一个id,这不是我想要的,或者我觉得不对
我该如何解决这个问题,或者这就是路由的工作原理?我对 ASP.Net
的 mvc 路由有点陌生
$("#partialPageContainer").load('/Space/SpaceOverview/1', function (response, status, xhr) {
alert("Load was performed.");
});
已更新 - 我想现在我将只使用“/space/actionname/1”连接到每个操作,直到找到更好的解决方案。
如果你想发送动作参数试试这个:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
您可以使用参数约束来过滤掉 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
edit:我相信你也可以使用内置的路由约束之一(这可能会更好,因为从技术上讲,一个值可以匹配 @"\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()}
);
如何更正路由以解决 ajax .load()
的问题我修改了通往 space 控制器的路线,使其看起来像这样
routes.MapRoute(
name: "SpaceCleanRoute",
url: "Space/{id}",
defaults: new { controller = "Space", action = "Index" }
);
这样我就有了一条更清晰的路线,当用户想要看到 space 时,URL 将看起来像这样
www.mysite/space/12345
我现在遇到的问题是当我的 JS 文件像这样调用 .load() 时,其中 spaceoverview 是我的操作
$("#partialPageContainer").load('/Space/SpaceOverview', function (response, status, xhr) {
alert("Load was performed.");
});
我收到一条错误消息
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Index(Int32)' in 'YogaBandy2017.Controllers.SpaceController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters
所以我必须像这样在url后面放一个id,这不是我想要的,或者我觉得不对
我该如何解决这个问题,或者这就是路由的工作原理?我对 ASP.Net
的 mvc 路由有点陌生$("#partialPageContainer").load('/Space/SpaceOverview/1', function (response, status, xhr) {
alert("Load was performed.");
});
已更新 - 我想现在我将只使用“/space/actionname/1”连接到每个操作,直到找到更好的解决方案。
如果你想发送动作参数试试这个:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
您可以使用参数约束来过滤掉 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
edit:我相信你也可以使用内置的路由约束之一(这可能会更好,因为从技术上讲,一个值可以匹配 @"\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()}
);