子类别的新 url 的 MVC 5 路由问题

MVC 5 routing issue with new url for subcategories

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

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

[HttpPost]
[Route("Shop/{brand}/{category}/{subcategory?}/{page:int?}")]
public ActionResult Index(ProductsViewModel pvm)
{ //...

这是我的观点:

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

当我提交页面时,它点击了 httppost 方法,但 url 仍然是:Shop/nike/shoes 即使我从下拉列表中选择了子类别跑鞋。 我想要 url 喜欢:

作为一个网络表单专家,我很难导航到新的 url 并使用视图模型属性作为参数。

编辑 post编辑了我的UI: 解释我的 ui:

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

第二个应该post'back'对产品进行排序。

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

应该获取分页,以便您可以深入链接到某个页面:shop/nike/shoes/runningshoes/page2 等

在您的 BeginForm(...) 中,您最终不得不使用 Subcategory = "runningshoes"

传递路由值字典

这确实混合了由 GET 传递的值,也就是通过路由值字典在查询字符串中传递的值,以及 POST,这将是来自表单的值,但将完成您正在尝试做的事情。可以阅读有关 BeginForm(..) 重载 Here on MSDN

的更多信息

你应该得到:

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

编辑

刚刚意识到您希望表单 post 中的值包含在响应的 QueryString 中。与其直接从表单 Post 的 MVC 方法返回视图,您可能做的是 return RedirectToAction("ActionName", "ControllerName", new { subcategory = request.SubCategory });,您将有一个专门支持此重定向的操作。

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