gpt4 book ai didi

asp.net-mvc - ASP.NET MVC : Route with optional parameter,,但如果提供,则必须匹配\d+

转载 作者:行者123 更新时间:2023-12-01 22:41:26 27 4
gpt4 key购买 nike

我正在尝试编写一个包含可为空 int 的路由。应该可以访问 /profile/,也可以访问 /profile/\d+

routes.MapRoute("ProfileDetails", "profile/{userId}",
new {controller = "Profile",
action = "Details",
userId = UrlParameter.Optional},
new {userId = @"\d+"});

如您所见,我说 userId 是可选的,但它应该与正则表达式 \d+ 匹配。这不起作用,我明白为什么。

但是我如何构造一条既匹配 /profile/ 又匹配 /profile/ 后跟数字的路由?

最佳答案

最简单的方法是添加另一个不带 userId 参数的路由,这样你就有了后备方案:

routes.MapRoute("ProfileDetails", "profile/{userId}",
new {controller = "Profile",
action = "Details",
userId = UrlParameter.Optional},
new {userId = @"\d+"});

routes.MapRoute("Profile", "profile",
new {controller = "Profile",
action = "Details"});

据我所知,唯一可以做到这一点的其他方法是使用自定义约束。所以你的路线将变成:

routes.MapRoute("ProfileDetails", "profile/{userId}",
new {controller = "Profile",
action = "Details",
userId = UrlParameter.Optional},
new {userId = new NullableConstraint());

自定义约束代码将如下所示:

using System;
using System.Web;
using System.Web.Routing;
using System.Web.Mvc;

namespace YourNamespace
{
public class NullableConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.IncomingRequest && parameterName == "userId")
{
// If the userId param is empty (weird way of checking, I know)
if (values["userId"] == UrlParameter.Optional)
return true;

// If the userId param is an int
int id;
if (Int32.TryParse(values["userId"].ToString(), out id))
return true;
}

return false;
}
}
}

我不知道 NullableConstraint 是这里最好的名称,但这取决于您!

关于asp.net-mvc - ASP.NET MVC : Route with optional parameter,,但如果提供,则必须匹配\d+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3862336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com