Я пытаюсь сделать что-то подобное тому, что делает 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
если это возможно.
Мне удалось решить эту проблему с помощью пользовательского фильтра результатов действия
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.
Я не думаю, что вы сможете использовать 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);