2010-04-07 1 views
4

Это прекрасно работает:Как я могу отправить запрос 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-выход из этого | приводит к той же ошибке.


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


родственные:
Sending URLs/paths to ASP.NET MVC controller actions

ответ

3

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

Так что я сделал, заменил двоеточия символом unicode ¡на стороне javascript, а затем сделал обратное действие. как это:

браузер:

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

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

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

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

1

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

0

Похожие ответил здесь: https://stackoverflow.com/a/12037000/134761

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

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

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