【问题标题】:ASP.NET MVC : Ignore latter route elements in url for a form's actionASP.NET MVC:忽略 url 中后面的路由元素以进行表单操作
【发布时间】:2011-01-22 23:16:44
【问题描述】:

我有一个 URL /products/search,其中 Products 是控制器,Search 是操作。此 url 包含一个搜索表单,其操作属性是(并且应该始终是)/products/search 例如;

<%using( Html.BeginForm( "search", "products", FormMethod.Post))

在我在搜索结果中引入分页之前,这可以正常工作。例如,如果我搜索“t”,我会得到一个分页列表。所以在第 2 页上,我的网址如下所示:

/products/search/t/2

它显示搜索“t”的结果集的第 2 页。问题是表单操作现在也是 /products/search/t/2。我希望表单始终发布到 /products/search。

我的路线是:

routes.MapRoute( "Products search",
        "products/search/{query}/{page}",
        new { controller = "Products", action = "Search", query = "", page = 1 });

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

如何强制 Html.BeginForm(),或者更具体地说 Url.Action("Search", "Products"),忽略 url 中的 /query/page?

谢谢

【问题讨论】:

    标签: asp.net asp.net-mvc forms url routing


    【解决方案1】:

    通过添加另一条查询和页面不在 url 中的路线进行修复,这有点反直觉,因为更具体的路线在订单下方

    routes.MapRoute(
            "",
            "products/search",
            new { controller = "Products", action = "Search", query = "", page = 1 });
    
    routes.MapRoute(
            "",
            "products/search/{query}/{page}",
            new { controller = "Products", action = "Search"} //, query = "", page = 1 });
    
    routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = "" });
    

    【讨论】:

      【解决方案2】:

      顺序真的很重要,它命中的第一个匹配它使用的路由。因此捕获所有类型的路线应该在最后。这是一个有用的路由调试器,你可以用来找出问题所在。

      Route Debugger

      【讨论】:

      • 谢谢,那么问题是搜索查询和页面值在 url 中显示为查询参数,如下所示:/products/search?query=r&page=2 而不是 /products/search/r/ 2 所以这似乎是一个路由捕获 22
      • 好吧,如果您没有异议并且想要一个干净的 url,您应该在表单提交时使用 post 而不是 get。否则,如果您在 global.asax 中正确设置路由,您的 url 应该看起来不错。例如:“{controller}/{action}/{id}/{page}”
      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多