Asp.net mvc 5 MVC 5路由问题,具有子类别的新url

Asp.net mvc 5 MVC 5路由问题,具有子类别的新url,asp.net-mvc-5,asp.net-mvc-routing,razor-2,asp.net-mvc-viewmodel,Asp.net Mvc 5,Asp.net Mvc Routing,Razor 2,Asp.net Mvc Viewmodel,在我的productcontroller中,我有两种actionresult返回方法: [Route("Shop/{brand}/{category}/{subcategory?}/{page:int?}")] public ActionResult Index(string brand, string category, string subcategory, int? page, SortOptions currentSort = SortOptions.SinceDesc) { //...

在我的productcontroller中,我有两种actionresult返回方法:

[Route("Shop/{brand}/{category}/{subcategory?}/{page:int?}")]
public ActionResult Index(string brand, string category, string subcategory, int? page, SortOptions currentSort = SortOptions.SinceDesc)
{ //... 

这是我的观点:

@using (@Html.BeginForm("Index", "Products", FormMethod.Post))
{
    @Html.DropDownListFor(x => x.SubCatID, Model.SubCategoriesSelectList, new { @class = "multiselect" })
}
当我提交页面时,它会点击httppost方法,但url仍然是:Shop/nike/shoes,即使我从下拉列表中选择了runningshoes子类别。 我希望有如下URL:

  • 商店/耐克/鞋
  • 商店/耐克/鞋/跑步鞋
作为一个网络表单爱好者,我很难导航到新的url并使用viewmodel属性作为参数

编辑发布我的用户界面: 要解释我的ui,请执行以下操作:

第一个下拉列表应
获取子类别。例如:shop/nike/shoes/runningshoes

第二个应该发布“back”来分类产品

价格滑块应该发回,因为它应该过滤。(如果没有分页,将筛选客户端)

页面应该设置为可以深入链接到特定页面:shop/nike/shoes/runningshoes/page2等。

在您的
beginfound(…)
中,您必须传递带有
Subcategory=“runningshoes”的路由值字典。

这将混合GET传递的值,也就是查询字符串中通过路由值字典传递的值和POST传递的值,这将是表单中的值,但将完成您尝试执行的操作。关于
BeginForm(..)
过载,可以阅读更多信息

您应该以以下方式结束:

@using (@Html.BeginForm("Index", "Products", new { subcategory = "runningshoes" }, FormMethod.Post))
{
    @Html.DropDownListFor(x => x.SubCatID, Model.SubCategoriesSelectList, new { @class = "multiselect" })
}
编辑

刚刚意识到您希望表单post中的值位于响应的查询字符串中。与直接从表单Post的MVC方法返回视图不同,您可以做的是
返回RedirectToAction(“ActionName”,“ControllerName”,new{subcategory=request.subcategory})您将有一个操作专门支持此重定向


可以找到有关重定向到操作的其他信息

表单值没有反映在路由中(幸运的是)。如果您想要基于所选子类别的url,则需要重定向到GET方法(传递参数)Ok,但我有多个下拉列表和其他选项。所以我需要他们每个人的表格?例如4次
,如果您愿意,您可以使用上面的RedirectToAction编辑,并且只有一个表单。您可以空检查不同的选项,并相应地重定向,从而构建出您最终想要的完整URL。您现在在URL中看不到子类别的原因是您通过POST发送值,POST在请求正文中发送值,而不是查询字符串。MVC支持RouteValue字典(或来自匿名对象路由值)更改给定路由定义的URL。我希望这会有帮助,如果你不愿意澄清的话,我会尽我所能。oor另一个想法是完全取消表单帖子,只使用form.GET。如果这更多是出于导航目的,那么无论如何,你都会想要一篇文章的功能,而不是一篇文章。我编辑了我的答案,给你一些选择。有任何问题,请提问!谢谢,用UI更新了这个问题,以及我试图在其中构建的操作。我想知道最好的方法是什么。我会选择重定向到操作方法或使用FormMethod.GET连接到路由。我100%知道RedirectToAction方法会起作用,而且我相当肯定FormMethod.GET而不是POST也会起作用。由你决定。两者都是同样正确的解决方案。
@using (@Html.BeginForm("Index", "Products", new { subcategory = "runningshoes" }, FormMethod.Post))
{
    @Html.DropDownListFor(x => x.SubCatID, Model.SubCategoriesSelectList, new { @class = "multiselect" })
}