如何自定义编码/解码路由值?

时间:2011-10-17 11:18:04

标签: asp.net-mvc asp.net-mvc-3 routes url-routing

我有这条路线:

{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 !的字符,但是我不想在控制器内使用ad-hoc自定义代码。我希望控制器能够完整地接收id,已经解码了。我希望我的Url.Action生成正确编码的网址。从MVC那里要求的太多了,还是我需要分散ActionFilters和自定义URL助手?

我能找到的唯一方法是引入自定义IRouteConstraint来操纵它收到的RouteValueDictionary。这听起来像是一个肮脏的黑客:一个操纵其输入的约束。上帝知道它的副作用。你认为这是一个足够理智的想法,还是ASP.NET MVC中有更好的机制允许这样做?

编辑:此解决方法仅在解析路线时有效,而不是在生成路线时有效。

1 个答案:

答案 0 :(得分:1)

你想要做的事情是无法做到的;在SO上已经多次回答了这个问题 - 尤其是最近关于RavenDb的问题,默认情况下在Id字段中使用“/”(尽管可以更改)