Rob*_*nik 7 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() }); ;
}
Run Code Online (Sandbox Code Playgroud)
而不是
我知道了
Stackoverflow做了非常相似的事情,我想做同样的事情.我不希望我的URL在我的URL中被转义.但RedirectToAction如果可能的话我还是想用.
我认为你不能按照自己的意愿使用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);
Run Code Online (Sandbox Code Playgroud)
我设法通过使用自定义操作结果过滤器解决了这个问题
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
就是这样。用此属性装饰我的Search()操作方法将所有编码的加号替换为实际的加号。URL 现在显示在 Stackoverflow 上。
| 归档时间: |
|
| 查看次数: |
2331 次 |
| 最近记录: |