我正在尝试使用 REGEX 获取路由约束以与路径中的 GUID 一起使用,但看不出哪里出错了。
URL 被重新路由到正确的页面,但正则表达式被完全忽略(我可以放入任何垃圾,它会匹配所有内容)。
代码如下:(注意 - 这不是 MVC,而是 ASP.Net 4.5 上的 Web 表单)
Imports System.Web.Routing
Imports Microsoft.AspNet.FriendlyUrls
Public Module RouteConfig
Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.EnableFriendlyUrls()
Dim guidRegex As String = "^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$"
routes.MapPageRoute("Redirect", "r/{lid}", "~/redirect.aspx", True, New RouteValueDictionary(New With {.lid = guidRegex}))
End Sub
End Module
我已经用其他正则表达式尝试过这种技术(示例是直接从 Microsoft 站点复制的),但它也不起作用。 我做错了什么,但我无法弄清楚。
最佳答案
我知道这已经是差不多 2.5 年后的事了,对于延迟回复您表示歉意...但是,我今天刚刚在 ASP.Net 4.5 Webforms 中第一次尝试路由,结果我偶然发现了今天你的答案。因此,如果其他人(例如我下次遇到这种情况时的我)发现它有用,我会将其发布。
您的正则表达式不起作用的原因是您缺少 Microsoft 示例中包含的某些内容...默认值。 MapPageRoute 方法实际上包含最多六个参数:名称、URL 模式、物理文件、是否要检查文件是否存在、默认值和约束。)
在上面的示例中,您的正则表达式将作为默认值应用,而不是您可能期望的约束;这让我花了大约 2.5 个小时。因此,为了让您的示例正常工作,您需要添加默认值。由于您没有任何默认值,因此您可以添加 Nothing,它就会起作用。
使用您的示例,并修改一行:
Imports System.Web.Routing
Imports Microsoft.AspNet.FriendlyUrls
Public Module RouteConfig
Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.EnableFriendlyUrls()
Dim guidRegex As String = "^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$"
routes.MapPageRoute("Redirect", "r/{lid}", "~/redirect.aspx", True, Nothing, New RouteValueDictionary(New With {.lid = guidRegex}))
End Sub
End Module
因此,你的答案是......字面上......什么都没有。
关于ASP.NET webforms 4.5 MapPageRoute Route Constraint w/regex 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505735/