У меня есть этот маршрут:
{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 есть лучший механизм, позволяющий это сделать?
РЕДАКТИРОВАТЬ : Этот обходной путь работает только при разборе маршрута, а не при его создании.