默认路由不捕获查询字符串

时间:2014-12-17 10:18:16

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

我有一个Asp.Net MVC应用程序,我希望Home\Index控制器操作采用一个可选参数,服务器将使用该参数来决定返回哪个视图。

所以我定义了以下路线:

routes.MapRoute(
  name: "LogOn",
  url: "logon/{id}",
  defaults: new {controller = "Home", action = "LogOn", id = UrlParameter.Optional}
  );
routes.MapRoute(
  name: "register",
  url: "register/{id}",
  defaults: new {controller = "Home", action = "Register", id = UrlParameter.Optional}
  );      
routes.MapRoute(
   name: "Default",
   url: "{controller}/{action}/{id}",
   defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional}
   );

这些路线允许我通过不必指定Home控制器来简化我的网址,因此mysite/Home/logon之类的网址被简化为mysite/logon。 / Index操作,其中所有未解析的URL看起来像这样:

public ActionResult Index(string id="")
{
    if (id.Contains("App"))
      return View("AppView")
    return View();
}

问题

当我将localhost/#app/41发送到我的服务器时,我希望id#app/41但不是。{0}。 id始终设置为空。

我的路线定义是否有错误/缺失?

2 个答案:

答案 0 :(得分:3)

您不能使用Fragement identifier作为查询字符串值,因为片段标识符根本没有发送到服务器,它仅供浏览器使用(主要用于Anchor links })。

如果您坚持使用#,则必须先对其进行编码,但这看起来并不像您期望的那样漂亮。

答案 1 :(得分:1)

#不是可接受的查询字符串字符。如果要将#作为查询字符串参数传递,则应将其编码为%23。您的正确网址应该类似于

localhost/?id=%23app/41