2011-10-17 19 views
2

我有这样的路线:如何自定义编码/解码路由值?

{controller}/{id}/{action} 

因为我觉得它使来自REST风格的角度来看更有意义。

问题是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要求太多,还是我需要分散ActionFilters和自定义URL助手?

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

编辑:此解决方法仅适用于解析路径时,不适用于生成路径。

+1

你总是可以写一个[自定义的HttpModule(HTTP:/ /stackoverflow.com/questions/7251285/iis-treats-double-encoded-forward-slashes-in-urls-differently-on-the-first-reque)来处理这个它到达MVC管道之前。 –

回答

1

你正在尝试做无法做到的;这已经对SO回答几次 - 关于RavenDb特别是最近,它使用“/”,在默认情况下,号码字段(虽然这是可以改变的)

+3

对不起 - 过于简单的答案。我应该说的是,看起来*并不是一个很好的方法来实现这一点。 –

+0

你的意思是自定义路由编码无法完成?我不同意。如果我愿意用我自己的UrlHelper和我本人ActionFilters或自定义模型粘合剂,它很可能有自定义编码/解码到位。我只是不想处理这个开销。 –

+0

oops刚刚看到您的评论。 –