MVC: 在一个包含多个表单的页面中提交一个表单

3

我正在一款ASP.NET 3.5 MVC应用程序中工作,其中有一个视图包含多个表单。表单1包含有关产品的信息,并将形成一个带有删除按钮的购物车。表单2如下所示,用于从购物车中获取信息并创建订单。

<% using (Html.BeginForm()) { %>
   <%=Html.Hidden(Order.ProductId", "E63EF586-F625-4C8D-B82E-E63A6FA4A63C")%>
   <%=Html.Hidden(Order.Amount", 16)%>
   <input type="submit" value="Pay" />

第一个表单包含类似于beginform的内容,其中使用foreach循环从模型中获取有关产品的信息。当我在第二个表单上使用提交按钮时,似乎所有内容都已提交,并且第一个表单的控制器正在尝试处理请求。这就是错误发生的地方,因为视图模型中的信息与预期的不符。
尝试处理请求的控制器:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ShowShoppingcartForm([Bind(Prefix = "Order")] MyViewmodel viewModel)
{
//..
}

期望处理请求的控制器:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveOrder([Bind(Prefix = "Order")] MyViewmodel viewModel)
{
    //..
}

修改后:

好的,我尝试了你的建议,但不幸的是我无法让它起作用。我按照以下方式进行了更改:

表格1:

<%foreach (var cartItem in Model.ProductList) { %>
  <% using (Html.BeginForm("ShoppingCart","ControllerName", FormMethod.Post,null)) { %>
        <tr>     
            <td> <%=Html.Hidden("Cart.ProductVariantId", cartItem.ProductVariant.Id)%>
                 <%=Html.Encode(cartItem.ProductVariant.Product.Name)%> </td>
            <td> <%=Html.Encode(cartItem.ProductVariant.Product.Description)%> </td>
            <td> <%=Html.TextBox("Cart.Amount", cartItem.Amount)%></td>
            <td> <%=Html.Encode(cartItem.Amount)%> </td>
            <td> <%=Html.Encode(cartItem.Product.PriceInCents)%> </td>
            <td> <input type="submit" value="Remove" width="50px" /> </td>
            <td> <input type="submit" value="Submit" width="50px" /> </td>
        </tr>
        <% } %> 
    <% } %>

表格 2:

<% using (Html.BeginForm("SaveOrder", "ControllerName", FormMethod.Post, null))
{%>

   <%=Html.Hidden("Order.ProductId", "E63EF586-F625-4C8D-B82E-E63A6FA4A63C"")%>
   <%=Html.Hidden(Order.Amount", 1)%>
   <input type="submit" value="Pay" />
<%} %>
3个回答

2

您可以使用Html.BeginForm指定操作和控制器的名称(可选)。

<% using (Html.BeginForm("SaveOrder", "ControllerName", FormMethod.Post, null))
{ %>
....

机器人感谢您的快速回复,我从来不知道这是可能的!我会尝试并回复您。 - Rob
好的,我尝试了你的解决方案,但不幸的是它并没有起作用 :( 我已经根据当前情况修改了问题。 - Rob
在你的示例中,你将控制器称为“Controller”。这应该是你控制器的实际名称。 - Dan Diplo
由于应用程序的更改,我能够以其他方式解决它。但无论如何,感谢您的提示,我从未知道这是可能的,并且可以非常好地使用它! - Rob

1

你应该在第二个表单上使用Html.BeginForm的重载形式来指定要使用的操作和控制器,例如:

<% using (Html.BeginForm("SaveOrder", "YourController")) { %>

0

Rob,

你应该指定你的控制器的名称,而不仅仅是像你编辑的代码中那样使用“Controller”。因此,如果你的SaveOrder操作在HomeController控制器类中,则应该使用:

<% using (Html.BeginForm("SaveOrder", "Home", FormMethod.Post, null)) { %>

抱歉让您感到困惑,但这就是我在代码中所做的事情,但由于公司限制,我不允许发布确切的代码,因此我重命名了控制器。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接