【发布时间】:2011-10-17 11:18:03
【问题描述】:
我有这条路线:
{controller}/{id}/{action}
因为我认为从 RESTful 的角度来看它更有意义。
问题在于id 可以包含斜杠 (/),即使编码为“%2F”,它们也会被视为路由分隔符。即使我有这个 Web.config 部分:
<uri>
<schemeSettings>
<add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
<add name="https" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
</schemeSettings>
</uri>
因为我在中间有id,所以我不能采用{*id} 方法来捕获包括action 在内的其余路线。
看来我唯一的选择是将/ 编码为符合RFC 的字符,例如!,但是我不想在控制器中使用临时自定义代码来实现。我希望控制器完整接收已解码的id。我希望我的Url.Action 生成正确编码的 URL。对 MVC 的要求太多了,还是我需要分散 ActionFilter 和自定义 URL 帮助程序?
我能找到的唯一方法是输入一个自定义的IRouteConstraint 来操纵它接收到的RouteValueDictionary。不过,这听起来像是一个肮脏的技巧:操纵其输入的约束。天知道它的副作用。你认为这是一个足够理智的想法,还是在 ASP.NET MVC 中有更好的机制允许这样做?
编辑:此解决方法仅在解析路由时有效,在生成路由时无效。
【问题讨论】:
-
你总是可以写一个custom HttpModule 在它进入MVC管道之前处理它。
标签: asp.net-mvc asp.net-mvc-3 routes url-routing