不希望RedirectToAction()转义“加”字符

时间:2010-02-09 14:10:34

标签: asp.net-mvc redirect escaping

我正在尝试做类似于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在我的URL中被转义。但如果可能,我仍然想使用RedirectToAction

2 个答案:

答案 0 :(得分:7)

我认为您无法按照自己的意愿使用RedirectToAction。问题是它将始终对您的参数进行URL编码。

我认为你必须自己处理查询字符串。我的建议是使用Url.Action()生成基本URL,因为它与RedirectToAction的工作方式大致相同但返回一个字符串。然后你必须自己生成查询字符串。请不要忘记在每个查询字符串项目上使用Url.Encode()。

我也有一个想法,你可以通过自定义路线完成你想要的。我不是那方面的专家,但我在路线中看到了使用正则表达式的东西,这可能是值得研究的东西。

编辑:我想出了一种更简单的方法来做你想做的事。不要自己手动添加加号,只需使用Url.Action()创建完整的正确URL,然后用加号替换所有%20实例。然后redirct到那个网址。像:

string newUrl = Url.Action("Search", new { query = query });
string plussedUrl = newUrl.Replace("%20", "+");
return new RedirectResult(plussedUrl);

答案 1 :(得分:3)

使用操作结果过滤器

我设法通过使用自定义操作结果过滤器来解决此问题

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上。