URL-кодировать параметры в ActionLink? - PullRequest
2 голосов
/ 30 ноября 2009

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

        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, Bad reqest. Я предполагаю, что мне нужно каким-то образом закодировать мой параметр области, но я не могу понять, как это сделать. Любая помощь приветствуется.

Спасибо!

Ответы [ 3 ]

1 голос
/ 06 сентября 2010

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

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---", ":");
        }

    }
}
0 голосов
/ 01 декабря 2009

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

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

0 голосов
/ 30 ноября 2009

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

Server.UrlEnconde(item.Name)

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

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

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

...