【问题标题】:How can I custom encode/decode route values?如何自定义编码/解码路由值?
【发布时间】: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 中有更好的机制允许这样做?

编辑:此解决方法仅在解析路由时有效,在生成路由时无效。

【问题讨论】:

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


【解决方案1】:

你想做的事是做不到的;这已在 SO 上多次回答 - 特别是最近与 RavenDb 相关,默认情况下在 Id 字段中使用“/”(尽管可以更改)

【讨论】:

  • 对不起 - 过于简单的答案。我应该说的是,似乎没有优雅的方式来实现这一目标。
  • 你的意思是不能自定义路由编码?我不同意。如果我愿意使用我自己的 UrlHelper 和我自己的 ActionFilters 或自定义模型绑定器,则很有可能使用自定义编码/解码。我只是不想处理这些开销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 2021-07-06
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多