我有这条路线:
{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中有更好的机制允许这样做?
编辑:此解决方法仅在解析路线时有效,而不是在生成路线时有效。
答案 0 :(得分:1)
你想要做的事情是无法做到的;在SO上已经多次回答了这个问题 - 尤其是最近关于RavenDb的问题,默认情况下在Id字段中使用“/”(尽管可以更改)