Как URL кодировать параметры в ASP .NET MVC - PullRequest
7 голосов
/ 05 мая 2011

У меня есть следующий код на мой взгляд:

<%= Html.ActionLink(
           "View item", 
           "Index", 
            "Items", 
            new 
            { 
                itemName = Model.ItemName 
            }, 
            null) %>

У меня проблема, когда имя элемента содержит острый (#) или символ процента (%).

  • Когда имя элемента - "name#with#sharp#", контроллер получает только первую часть имени до первого резкого (только получает "name").

  • Когда имя элемента "name%with%percent" Я получаю сообщение об ошибке: Ошибка HTTP 400 - неверный запрос.

Я не уверен, что это проблема с кодировкой URL, потому что она работает с другими конфликтующими символами, такими как:

;
=
+
,
~
[blank]

Знаете ли вы, как я могу решить эту проблему?

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 05 мая 2011

Я предполагаю, что у вас есть настройка маршрута, и ваш URL выглядит примерно так:

http://localhost/Items/Index/name%25with%25percent - (это взорвется)

в противоположность этому:

http://localhost/Items/Index/?itemName=name%25with%25percent - (строка запроса в порядке)

Таким образом, можно было бы удалить свойство itemName из вашего маршрута (в вашей коллекции RouteCollection), чтобы Html.ActionLink отображал URL-адрес, используя itemName в качестве параметра QueryString.

Как говорит @Priyank, проблема в том, что itemName является частью Url (не параметром QueryString) и содержит недопустимые символы.

4 голосов
/ 05 мая 2011

Поскольку эти перенаправленные значения публикуются как часть строки URL, они будут обрабатываться как отдельные значения, разделенные # и%. Есть несколько вариантов обработки вашего дела.

Вам нужно будет реализовать свой пользовательский ValueProvider (IValueProvider and especially RouteDataValueProvider) для удовлетворения ваших пользовательских потребностей. У одного программиста была проблема с символом '/', и он взломал его здесь http://mrpmorris.blogspot.com/2012/08/asp-mvc-encoding-route-values.html

Второй - хранить значения в TempData, которые сохраняются в течение двух запросов, и использовать их.

Надеюсь, что это помогает думать в правильном направлении.

0 голосов
/ 05 мая 2011

Вы должны иметь возможность просто использовать экземпляр UrlHelper своего представления, чтобы сделать это для вас. Попробуйте дать этому выстрел:

<%= Html.ActionLink( "View item", "Index", "Items", new { itemName = Url.Encode(Model.ItemName) }, null) %>

Обновление

После тестирования кажется, что явное кодирование, как я делал выше, кажется точным на меньше и приведет к двойному кодированию сервера (например, -% будет отображаться как% 2525 в URL).

...