我正在尝试做类似于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
。
答案 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上。