我的MVC4网站显示数据库中的项目用户可以在网络表单中“优化”他们的搜索。在此之后,他们单击搜索按钮并显示其结果。
在这个阶段,我只有1条路线
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/",
defaults: new { controller = "Home", action = "Index" }
);
当我第一次加载页面时,地址为www.mydomain.com/products/connectors/
,在我进行搜索后,它会附加我的查询字符串
www.mydomain.com/products/connectors/?Gender=1
现在,我正在添加分页,并希望用户能够选择下一页。我使用了来自How do I do pagination in ASP.NET MVC?的Marc答案来做到这一点。分页效果很好。
这是routeconfig.cs
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "AllRefineSearch",
url: "{controller}/{action}/{startIndex}/",
defaults: new { controller = "Products", action = "Connectors", startIndex = 0, pageSize = 10 }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/",
defaults: new { controller = "Home", action = "Index" }
);
}
}
现在问题是,当我点击搜索按钮时,我的控制器和动作将从地址中删除。换句话说,地址是www.mydomain.com/?Gender=1
我不知道如何将控制器和操作保留在URL中,因为我认为路由指定了这个!
我的表单是
@using (Html.BeginForm("Connectors", "Products", FormMethod.Get))
{
@Html.DropDownListFor(a => a.Gender, Model.ConnectorRefineSearch.Gender, "---Select---")
<input type="submit" value="Search" class="searchButton" />
}
我的控制器
[HttpGet]
public ActionResult Connectors(ConnectorVm connector, int startIndex, int pageSize)
{
connector.UpdateSearch();
return View(connector);
}
答案 0 :(得分:0)
问题在于 AllRefineSearch 路由及其默认值:“产品”控制器,“连接器”操作和“0”startIndex。
在路线中提供默认值也意味着这些段是可选的。在您的情况下,网址“/”将匹配该路线,并且每个细分都将采用其默认值。
在为链接,表单等生成URL时,会遵循类似的过程。您将“产品”作为控制器,“连接器”作为操作,因此将使用AllRefineSearch。因为它们是默认值,所以它会将表单标记的url简化为“/”。最后在提交时,将在查询字符串中添加输入值。
尝试不在控制器和操作段的搜索路径中提供默认值:
routes.MapRoute(
name: "AllRefineSearch",
url: "{controller}/{action}/{startIndex}/",
defaults: new { startIndex = 0, pageSize = 10 }
);