MVC 5路由问题与子类别的新URL

时间:2015-05-05 12:55:11

标签: 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)
{ //... 

[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方法,但网址仍然是:​​Shop / nike / shoes,即使我从下拉列表中选择子类别运行的鞋子。 我想有网址:

  • 店/耐克/鞋
  • 店/耐克/鞋/ runningshoes

作为一个网络形式的人,我很难导航到新的网址并使用viewmodel属性作为参数。

编辑发布了我的用户界面: enter image description here 解释我的ui:

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

第二个应该发布'返回'对产品进行分类。

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

分页应该如此,你可以深层链接到某个页面:shop / nike / shoes / runningshoes / page2等。

1 个答案:

答案 0 :(得分:1)

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

编辑

刚刚意识到你希望表单帖子中的值在响应的QueryString中。而不是直接从你的MVC方法返回视图的表格发布,你可能做的是return RedirectToAction("ActionName", "ControllerName", new { subcategory = request.SubCategory });,你将有一个行动,专门支持这种重定向。

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