Как я могу кодировать / декодировать значения маршрута? - PullRequest
2 голосов
/ 17 октября 2011

У меня есть этот маршрут:

{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, или мне нужно разбросать ActionFilters и пользовательские помощники по URL?

Единственный способ, который я мог найти, - это добавить пользовательский IRouteConstraint для манипулирования RouteValueDictionary itполучает.Это звучит как грязный хак: ограничение, манипулирующее его вводом.Бог знает его побочные эффекты.Считаете ли вы, что это достаточно разумная идея, или в ASP.NET MVC есть лучший механизм, позволяющий это сделать?

РЕДАКТИРОВАТЬ : Этот обходной путь работает только при разборе маршрута, а не при его создании.

1 Ответ

1 голос
/ 17 октября 2011

То, что вы пытаетесь сделать, не может быть сделано; на SO несколько раз отвечали, особенно в последнее время по отношению к RavenDb, который по умолчанию использует "/" в поле Id (хотя это можно изменить)

...