Как я могу отправить запрос GET, содержащий двоеточие, на контроллер ASP.NET MVC2?

Это отлично работает:

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


person Cheeso    schedule 07.04.2010    source источник


Ответы (3)


Я обнаружил, что кодировка 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, вам придется использовать непечатаемые символы для «закодированных» форм.

person Cheeso    schedule 07.04.2010

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

person em70    schedule 08.04.2010

Аналогичный ответ здесь: https://stackoverflow.com/a/12037000/134761

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

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

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

person angularsen    schedule 23.08.2012