子类别的新 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 喜欢:
- shop/nike/shoes
- shop/nike/shoes/跑鞋
作为一个网络表单专家,我很难导航到新的 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
在我的 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 喜欢:
- shop/nike/shoes
- shop/nike/shoes/跑鞋
作为一个网络表单专家,我很难导航到新的 url 并使用视图模型属性作为参数。
编辑 post编辑了我的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