我应该在我的命名路由中添加(url编码的)查询字符串?

时间:2009-03-11 14:10:05

标签: c# .net asp.net-mvc routing

在我的asp.net-mvc ontroller中,我接受了一堆表单字段值,并从那些创建一个Lucene库理解的字符串。 然后我想重定向到一个get方法,它将根据这个lucene字符串显示结果。

lucene字符串的格式为{fieldName1:value1 fieldName2:value2 ...}

我的Global.asax对重定向目标有以下条目:

routes.MapRoute(
    "AdvancedSearch",
    "AdvancedSearch.mvc/{displayType}/luceneString",
    new { controller = "Search", action = "AdvancedSearch",
          displayType = "chip", luceneString = "" }
);

所以我的控制器捕获帖子,创建luceneString并执行以下操作:

return RedirectToRoute("AdvancedSearch", new
    {
        Controller = "Search",
        action = "AdvancedSearch",            
        displayType = "chip",
        queryString = Url.Encode("company:test name:testname")
     });

这给了我一个500:糟糕的请求。 即使有一个参数,它也不起作用。即使使用“:”也不起作用 我试过了:

  • AdvancedSearch.mvc /芯片/公司%3Atest +名称%3AtestName
  • AdvancedSearch.mvc /芯片/公司:测试+名:测试名
  • AdvancedSearch.mvc /芯片/公司:测试
  • AdvancedSearch.mvc /芯片/公司%3Atest

仅当我更改此URL以采用

格式的queryString时,它才有效
AdvancedSearch.mvc/chip?q=company%3Atest+name%3AtestName

如果不采用“?q =”的话,我该如何才能正确编码 如果我必须使用查询字符串,我如何在路由表中定义这样的东西?我该如何调用重定向到它?

1 个答案:

答案 0 :(得分:3)

首先,您的MapRoute不应包含有关查询字符串的任何内容。路由仅包含URI的资源部分;它们不包含查询。

其次,您不需要对查询字符串进行编码; ActionLink的/ RouteLink /等。会为你做那件事。在构建HREF时,路径中未包含的任何令牌都将自动成为编码查询字符串参数。

卸下:

/luceneString

...从你的路线。

将您的代码更改为:

return RedirectToRoute("AdvancedSearch", new
{
    Controller = "Search",
    action = "AdvancedSearch",            
    displayType = "chip",
    q = "company:test name:testname"
 });