Как отправить запрос GET, содержащий двоеточие, на контроллер ASP.NET MVC2? - PullRequest
4 голосов
/ 07 апреля 2010

Это прекрасно работает:

GET /mvc/Movies/TitleIncludes/Lara%20Croft

Когда я отправляю запрос, содержащий двоеточие, например:

GET /mvc/Movies/TitleIncludes/Lara%20Croft:%20Tomb

... выдает ошибку 400. Ошибка говорит ASP.NET обнаружил недопустимые символы в URL.

Если я попытаюсь избежать перехода по URL, запрос будет выглядеть так:

GET /mvc/Movies/TitleIncludes/Lara%20Croft%3A%20Tomb

... и это также дает мне ошибку 400.

Если заменить двоеточие на | :

GET /mvc/Movies/TitleIncludes/Lara%20Croft|%20Tomb

.., который также был отклонен как незаконный, на этот раз с ошибкой 500. Сообщение: Недопустимые символы в пути.

URL-экранирование | приводит к той же ошибке.


Я действительно, действительно не хочу использовать параметр строки запроса.


связанные с:
Отправка URL / путей к действиям контроллера ASP.NET MVC

Ответы [ 3 ]

3 голосов
/ 07 апреля 2010

Я обнаружил, что кодировка URL не работает, но пользовательская кодировка работает.
Я предполагаю, что ASPNET MVC использует файловую систему для анализа и маршрутизации, потому что символ в URL, который недопустим в файловой системе, вызывает ошибку 500 или 400.

Итак, я сделал замену двоеточий на юникод ○ символ на стороне javascript, а затем выполните обратное действие. как это:

браузер:

function myEscape(s){
    return s.replace(':', '%C2%A1').trim();
}

в действии, вызовите это преобразование перед использованием аргумента:

private string MyCustomUnescape(string arg)
{
    return arg.Replace("¡", ":");
}

Тот же подход работает для слешей - просто выберите другой символ Юникода. Конечно, если ваши строковые аргументы являются Unicode, то вам придется использовать непечатаемые символы для «закодированных» форм.

1 голос
/ 09 апреля 2010

Если SEO не проблема, вы можете использовать base64, а затем urlencode. После первого шага каждый ваш символ будет легко закодирован. Декодирование в .NET так же просто, как использование помощника в System.Web.HttpUtility и System.Convert.

0 голосов
/ 23 августа 2012

Подобные ответы здесь: https://stackoverflow.com/a/12037000/134761

Используйте знак вопроса и амперсанды в качестве аргументов, а URL-адрес кодирует аргументы.

Пример: GET / mvc / Movies / TitleIncludes? Title = Lara% 20Croft% 3A% 20Tomb

Я согласен, что было бы неплохо также закодировать вещи в URL, но, вероятно, есть веская причина не делать этого.

...