我在 ASP.NET MVC3 中有一些非常奇怪的行为。基本上,我已经编写了一个在 BeginRequest 上触发的 HttpModule,它可能会使用HttpContext.RewritePath(string)
. 这在大多数情况下都能正常工作,但我注意到当我的 URL 中有空格时,ASP.NET MVC 在重写时的行为会有所不同。
示例网址:
http://www.mysite.com/my%20url
我的重写器设置了正则表达式,类似于 Helicon,它可以捕获一个组并在重写中使用该捕获的组。一个示例规则是:
<add original="^/(.*)\?test$" rewritten="/$1" />
http://www.mysite.com/my%20url?test
这将重写一个 URL ,例如http://www.mysite.com/my%20url
<-- 注意查询字符串消失了。这可以正常工作。
我的 MVC 路由设置为my%20url
使用通配符捕获部分,以便将其映射到“navstate”键下的 RouteData 值。规则如下所示:
"{*navstate}"
所以,当我不重写时,我的 RouteDataDictionary 包含:
key: "navstate" value: "my url"
当我重写时,我的 RouteDataDictionary 包含:
key: "navstate" value: "my%20url"
请注意,它没有对 RouteData 变量进行 URL 解码。
有人对此有任何想法吗?唯一似乎有所作为的是HttpContext.RewritePath(string)
在我的 HttpModule 中使用...关闭模块可确保正常运行。在 rewrite 调用之前手动解码 URLHttpUtility.UrlDecode(string)
也可以使它工作......但感觉就像一个 hack。
编辑:
这似乎不是 MVC 的错误,而是 ASP.NET 路由的错误,所以我已经更新了标签。