首页 > 解决方案 > Foreach 循环中 BeginForm() 的 ASP.NET MVC 路由问题

问题描述

首先,如果问题是微不足道的,请原谅我,但对于 ASP.NET,我是一个完全的新手。我只需要通过我的项目,我就完全陷入了困境。

我正在为在线商店准备购物篮功能。可用文章按以下方式列出:

@foreach( var element in Model.all_products )
{
  using( Html.BeginForm( "AddToBasket", "Basket", new { id = @Html.DisplayFor( Model=>element.id ), amountInBasket = Html.DisplayFor( Model => element.amountInBasket ) }, FormMethod.Get ) )
  {
     <tbody>
        <tr id="@Html.DisplayFor( Model => element.id )" class="warning">
           <th scope="row">   @Html.DisplayFor( Model => element.name )</th>
           <td>               @Html.DisplayFor( Model => element.price )</td>
           <td>               @Html.DisplayFor( Model => element.measureUnit )</td>
           <td>               @Html.TextBoxFor( Model => element.amountInBasket )</td>
           <td> <input type="submit" class="btn-success btn" value="Add to basket"></td>
        </tr>
     </tbody>
  } }

在 foreach 循环中,我为商店中可用的每篇文章创建一个表单。每个表单都包含一个提交,用于将给定数量的给定产品 ( element.amountInBasket) 添加到购物篮。element.id我的想法是识别(数据库中的文章 id)单击了哪个提交,并将其与element.amountInBasketBasketController 中的 AddToBasket 方法一起传递。AddToBasket 声明开始如下:

    [HttpGet]
    public async System.Threading.Tasks.Task<ActionResult> AddToBasket( decimal amountInBasket, int id )
    { ...

现在我的问题是 BeginForm() 生成的 url,比如说 id=2 和 amountInBasket=3,是:

https://localhost:44356/Basket/AddToBasket/2?element.amountInBasket=2

这会导致错误(它指出第二个参数为空)。经过一些尝试,我发现 AddToBasket 方法预期的 url 是:

https://localhost:44356/Basket/AddToBasket/2?amountInBasket=3

所以问题出在“元素”上。我的网址的一部分。一旦我手动删除它,我就达到了我的方法,一切都很完美。

有人可以告诉我如何解决这个问题吗?对我来说,“元素”是否无关紧要。部分从 url 中删除或保留在那里,只有方法被修改以接受它 - 我只需要使用我的方法。

标签: asp.netasp.net-mvcurlrazorurl-routing

解决方案


改变:

using( Html.BeginForm( "AddToBasket", "Basket", new { id = @Html.DisplayFor( Model=>element.id ), amountInBasket = Html.DisplayFor( Model => element.amountInBasket ) }, FormMethod.Get ) )

对此:

using( Html.BeginForm( "AddToBasket", "Basket", new { id = element.id , amountInBasket = element.amountInBasket }, FormMethod.Get ) )

推荐阅读