【问题标题】:MVC 5 routing issue with new url for subcategories子类别的新 URL 的 MVC 5 路由问题
【发布时间】:2015-05-05 12:55:11
【问题描述】:

在我的产品控制器中,我有两个 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,即使我从下拉列表中选择了子类别 runningshoes。 我想要这样的网址:

  • 商店/耐克/鞋子
  • 商店/耐克/鞋子/跑鞋

作为一个 webform-guy,我很难导航到新的 url 并使用 viewmodel 属性作为参数。

edit 发布了我的 UI: 解释我的用户界面:

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

第二个应该发布“返回”以对产品进行排序。

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

分页应该得到,这样您就可以深度链接到某个页面:shop/nike/shoes/runningshoes/page2 等。

【问题讨论】:

  • 表单值不会反映在路由中(幸运的是)。如果您想要基于所选子类别的 url,则需要重定向到 GET 方法(传递参数)

标签: asp.net-mvc-5 asp.net-mvc-routing razor-2 asp.net-mvc-viewmodel


【解决方案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找到

【讨论】:

  • 好的,但我有多个下拉菜单和其他选项。所以我需要他们每个人的表格?例如在一个页面上 4 次 <form ...></form? subcategory 参数应该是下拉列表的选定值。我希望你能理解我:) 谢谢你的时间!
  • 如果您愿意,您可以使用上面的 RedirectToAction 编辑并且只有一个表单。您可以检查不同的选项并相应地重定向,以构建您最终希望拥有的完整 URL。您现在在 URL 中看不到子类别的原因是您通过 POST 发送值,该值在请求正文而不是查询字符串中发送。 MVC 支持 RouteValue 字典(或来自匿名对象路由值)来更改给定路由定义的 URL。我希望这会有所帮助,如果不能随意澄清,我会尽力而为。
  • Oooooor 另一个想法是完全取消表单发布,只使用 Form.GET。如果这更多是出于导航目的,那么无论如何您都需要 GET 的功能而不是 POST。我编辑了我的答案,给你一些选择。有任何问题,请追问!
  • 谢谢,用 UI 和我尝试在其中构建的操作更新了问题。想知道最好的方法是什么。
  • 我选择的路径要么是 RedirectToAction 方法,要么是使用 FormMethod.GET 连接到路由。我 100% 知道 RedirectToAction 方法会起作用,而且我相当肯定 FormMethod.GET 而不是 POST 也应该起作用。从那里它取决于你。两者都是同样正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多