Не хочу, чтобы RedirectToAction () экранировал символы "плюс" - PullRequest
7 голосов
/ 09 февраля 2010

Я пытаюсь сделать что-то похожее на то, что делает Stackoverflow.

У меня есть текстовое поле быстрого поиска, и я могу ввести произвольное количество слов в и отправить свой поиск. Получающее действие делает это (сокращенная версия)

public ActionResult Search(string query)
{
 Regex rx = new Regex("(?<word>[a-zA-Z0-9]+)");

 StringBuilder parts = new StringBuilder();
 foreach(Match m in rx.Matches(query))
 {
  parts.Append(parts.Length > 0 ? "+" : string.Empty);
  parts.Append(m.Groups["word"]);
 }
 return RedirectToAction("Search", new { query = parts.ToString() }); ;
}

Но вместо

http://localhost/search?query=word+word

Понятно

http://localhost/search?query=word%2Bword

Stackoverflow делает что-то очень похожее, и я бы хотел сделать то же самое. Я не хочу, чтобы мои плюсы скрывались в моих URL. но я все еще хотел бы использовать RedirectToAction, если это возможно.

Ответы [ 2 ]

7 голосов
/ 09 февраля 2010

Не думаю, что вы сможете использовать RedirectToAction так, как хотели бы. Проблема в том, что он всегда будет URL-кодировать ваши параметры.

Я думаю, вам придется обрабатывать строку запроса самостоятельно. Я предлагаю использовать Url.Action () для генерации базового URL, так как он работает почти так же, как RedirectToAction, но возвращает строку. И тогда вам придется сгенерировать строку запроса самостоятельно. Пожалуйста, не забудьте использовать Url.Encode () для каждого элемента строки запроса.

У меня также есть предположение, что вы можете выполнить то, что хотели бы, по пользовательскому маршруту. Я не эксперт в этом, но я видел кое-что об использовании регулярных выражений в маршрутах, и это может быть чем-то стоящим.

Редактировать: я придумал более простой способ делать то, что вы хотите. Вместо того, чтобы вручную добавлять знаки плюс, просто создайте полный правильный URL-адрес с помощью Url.Action (), а затем замените все экземпляры% 20 знаком плюс. Затем перенаправьте на этот URL. Как:

string newUrl = Url.Action("Search", new { query = query });
string plussedUrl = newUrl.Replace("%20", "+");
return new RedirectResult(plussedUrl);
3 голосов
/ 09 февраля 2010

Использование фильтра результатов действия

Мне удалось решить эту проблему с помощью пользовательского фильтра результатов действий

public class UnescapePlusAttribute: FilterAttribute, IResultFilter
{
    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
        if (filterContext.Result is RedirectToRouteResult)
        {
            string loc = filterContext.HttpContext.Response.RedirectLocation;
            loc = loc.Replace("%2B", "+");
            filterContext.HttpContext.Response.RedirectLocation = loc;
        }
    }
}

Вот и все. Украшение моего Search() метода действия этим атрибутом заменило все закодированные плюсы действительными URL теперь отображается как в Stackoverflow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...