gpt4 book ai didi

asp.net-mvc - 为什么使用此正则表达式时 ASP.NET-MVC 路由的 UrlParameter.Optional 被忽略?

转载 作者:行者123 更新时间:2023-12-03 00:07:20 24 4
gpt4 key购买 nike

这是我今天早上遇到的 ASP.NET MVC URL 路由问题的简化示例。

相当简单,我想要调用路由的 Action,无论是否提供了末尾的参数。

这条路线工作正常,匹配 /apple//apple/test/

routes.MapRoute(    "Working Route",    "apple/{parameter}",    new {         controller = "Apple",         action = "Action",         parameter = UrlParameter.Optional    },    new { parameter = @"([a-z0-9\.-]+)" });

但是,第二条路由将仅匹配 /banana/test/ 等。当我尝试 /banana/ 时,路由器直接越过它并返回包罗万象的 404 错误。

routes.MapRoute(    "Non-Working Route",    "banana/{parameter}",    new {         controller = "Banana",         action = "Action",         parameter = UrlParameter.Optional    },    new { parameter = @"([a-z0-9]+)" });

唯一的区别是参数的正则表达式验证,但由于它是一个非常简单的正则表达式匹配,因此对于像 /banana/ 这样的 URL,它们都应该可以完美工作,但第二条路由失败来识别它。

我通过更改路由 #2 上的正则表达式以匹配路由 #1 上的正则表达式来回避我的问题,并接受“.”。和“-”字符,我只是想知道是否有人知道为什么会发生这种情况。

编辑:

以下是我在示例中使用的 Controller 和操作。这里没什么特别的。

public class AppleController : Controller{    public ActionResult Action(string parameter)    {        if (parameter == null)        {            parameter = "No parameter specified.";        }        ViewData["parameter"] = parameter;        return View();    }}public class BananaController : Controller{    public ActionResult Action(string parameter)    {        if (parameter == null)        {            parameter = "No parameter specified.";        }        ViewData["parameter"] = parameter;        return View();    }}

所以我的问题是 /apple/ 会显示“未指定参数。”,而 /banana/ 却给了我一个不想要的 404。

<小时/>到目前为止..

在路由声明中使用parameter = URLParameter.Optional:路线#1 工作正常,路线#2 在没有参数的情况下不匹配。

在路由声明中使用parameter = "":当参数离开 URL 时,路由 #1 和路由 #2 都无法匹配。

在 Action 方法签名中声明 parameter = "":由于 .NET 版本的原因,不可能。

删除所有其他路由没有任何效果。

最佳答案

如果标记是可选的,那么您使用的任何正则表达式约束也必须反射(reflect)这一点,例如(foo)?.

<小时/>我能够在 .NET 4 上使用 ASP.NET MVC 2 重现此问题。然后我升级到 ASP.NET MVC 3,一切都按预期工作。我上面提出的解决方案不适用于 ASP.NET MVC 2,但它适用于 ASP.NET MVC 3,因此我只能假设这是 v2 上的一个错误,现已在 v3 中修复。

您可以引用 v2,并在 web.config 上使用它来测试 v3:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>

关于asp.net-mvc - 为什么使用此正则表达式时 ASP.NET-MVC 路由的 UrlParameter.Optional 被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4958687/

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