麻烦搞清楚路由。这个URL的Maproute(C#)

时间:2010-10-06 23:00:32

标签: asp.net-mvc-2 url-rewriting url-routing

尽管有大量的URL路由帖,但我尚未就此主题达成启示。

我有一个可以正常使用的MVC应用程序,但我希望得到一些想法并进行一些URL重写以使我的用户更容易。

默认路线与通常情况略有不同:

routes.MapRoute(
      "Default",
      "{controller}/{action}/{query}",
      new{ controller = "SomeController", action="Index", query = "" });

我想要做的是使用12345查询将URL http://mysite.com/12345重新路由到SomeController的Details操作。我试过这个:

routes.MapRoute(
      "DirectToDetails",
      "{query}",
      new{ controller = "SomeController", action="Details" query="" });

routes.MapRoute(
      "Default",
      "{controller}/{action}/{query}",
      new{ controller = "SomeController", action="Index", query = "" });

但最终会模糊http://mysite.com/,它会转到SomeController / Details而不是SomeController / Index。

编辑:

根据@Jon的建议我删除了匿名对象中的query =“”:

routes.MapRoute(
      "DirectToDetails",
      "{query}",
      new{ controller = "SomeController", action="Details" });

......就这个问题提出了问题;现在,当我在Views / SomeView / Index(提交上述SomeController / Details)提交表单时,我收到“无法找到资源”错误。

以下是表单声明:

<% using (Html.BeginForm(
              "Details", 
              "SomeController", 
              FormMethod.Post, 
              new { id = "SearchForm" })) { %>
    <% Html.RenderPartial("SearchForm", Model); %>
    <%= Html.ValidationMessageFor(model => model.Query) %>
<% } %>

1 个答案:

答案 0 :(得分:0)

删除query = ""(显然它不是可选的,因为你遇到的问题 - 如果没有合理的默认值,则不需要将它放在第3个参数中)并使用MapRoute的重载采用路径约束的第四个参数:

routes.MapRoute(
  "DirectToDetails",
  "{query}",
  new { controller = "SomeController", action="Details" },
  new { query = @"\d+" });

显然你需要调整正则表达式,如果它不是整数...


响应您的编辑...确保您已从“短”路线中删除了查询的默认值 - 您已在此处发布了默认值。还建议您仔细检查表单并确保它发布query的值(可能在post action方法上设置一个断点并确保查询参数绑定正确?)。