Не хочу RedirectToAction () Escape “плюс” символы

Я пытаюсь сделать что-то подобное тому, что делает Stackoverflow.

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

public ActionResult Search(string query)
{
 Regex rx = new Regex("(?[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 если это возможно.

7
задан Robert Koritnik 9 February 2010 в 19:56
поделиться

2 ответа

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

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

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.

3
ответ дан 7 December 2019 в 01:20
поделиться

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

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

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

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

string newUrl = Url.Action("Search", new { query = query });
string plussedUrl = newUrl.Replace("%20", "+");
return new RedirectResult(plussedUrl);
7
ответ дан 7 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: