Параметры URL-кодирования в ActionLink?

У меня зарегистрирован следующий маршрут;

        routes.MapRoute(
            "LocationsByArea",                                              
            "Locations/{system}/{storage}/{area}",          
            new { controller = "StorageLocation", action = "Index" },
            null
        );

... и следующий код, на мой взгляд;

<%= Html.ActionLink("Platser", "Index", "StorageLocation", new { system = Model.System, storage = Model.Storage, area = item.Name }, null)%>

Моя проблема заключается в том, что «area = item.Name» содержит двоеточие, например. «Площадь 4:1». Если я нажму на отображаемую ссылку, я получу HTTP-ошибку 400, неверный запрос. Я думаю, мне нужно каким-то образом закодировать параметр области, но я не могу понять, как это сделать. Любая помощь приветствуется.

Спасибо!


person Erik Z    schedule 30.11.2009    source источник


Ответы (3)


Встроенное кодирование/декодирование не работает, поэтому я предлагаю вам накатить его самостоятельно, например так:

namespace MyProject.Helpers
{
    public static class JobNameHelper
    {
        public static string JobNameEncode(string jobname)
        {
            return jobname.Replace(":", "---colon---");
        }

        public static string JobNameDecode(string jobname)
        {
            return jobname.Replace("---colon---", ":");
        }

    }
}
person Kjensen    schedule 06.09.2010

Можете ли вы не просто использовать

Server.UrlEnconde(item.Name)

Или я что-то упускаю?

В вашей маршрутизации вам, возможно, придется использовать Server.UrlDecde, хотя я думаю, что он должен декодировать для вас по запросу.

Попробуйте использовать отладчик маршрутизации, чтобы узнать, какой URL маршрутизатор проходит, тогда вы можете увидеть, где должно произойти декодирование

person Sheff    schedule 30.11.2009
comment
Я думаю, вам придется вернуть UrlDecode на другом конце при чтении обратно. Вы пробовали это? - person Sheff; 30.11.2009
comment
Да, есть, но я не лезу в контроллер. - person Erik Z; 30.11.2009
comment
Похоже, что декодирование должно происходить при маршрутизации, попробуйте отладчик маршрутизации (я обновил ответ) - person Sheff; 30.11.2009

ASP.NET 3.5 SP1 и более ранние версии имеют ряд ограничений на допустимость URL-адресов. В ASP.NET 4 большинство этих проблем были исправлены (или, по крайней мере, настраиваются через web.config). Я думаю, что символ двоеточия, даже если он закодирован, может быть запрещен в ASP.NET 3.5 SP1 и более ранних версиях из соображений безопасности. Разрешение двоеточий может быть проблемой безопасности при проверке файлов, так как это малоизвестный синтаксис для альтернативных потоков данных NTFS. .

Я рекомендую попробовать выбрать для этих целей символ, отличный от двоеточия. Может быть, вместо этого подойдет запятая, точка с запятой или знак равенства?

person Eilon    schedule 01.12.2009