ASP.NET MVC:忽略url中后面的路由元素以获取表单的操作

时间:2010-03-02 22:38:05

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

我有一个URL /产品/搜索,其中Products是控制器,Search是操作。此网址包含一个搜索表单,其操作属性为(并且应始终为)/ products / search eg;

<%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(“搜索”,“产品”),忽略网址中的/ query / page?

由于

2 个答案:

答案 0 :(得分:1)

修正了添加另一条路径,其中查询和页面不在网址中,这是一种反直觉的方式,因为更具体的路线在订单中更低

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 = "" });

答案 1 :(得分:0)

订单非常重要,它命中的第一条路线与它匹配使用。因此,抓住所有类型的路线应该在最后。这是一个有用的路由调试器,用于找出问题所在。

Route Debugger