2010-04-09 103 views
3

我正在ASP.NET 3.5 MVC应用程序中使用多个表单进行视图。表格1包含有关产品的信息,并将形成带有删除按钮的购物车。表格2如下所示,用于从购物车获取信息并创建订单。MVC:从多种形式的页面提交一个表格

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

第一种形式包含foreach循环类似beginform获取有关该模型中的产品信息。 当我在第二个窗体上使用提交按钮时,似乎一切都已提交,并且第一个窗体的控制器中的操作正在尝试处理该请求。这是错误发生的地方,因为视图模型中的信息与期望的不相符。

正试图处理请求控制器:

[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" /> 
<%} %> 

回答

2

您可以选择使用Html.BeginForm指定动作和控制器的名称

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

机器人感谢您的快速响应,从来没有新的这是可能的!我会尝试一下并回复你。 – Rob 2010-04-09 11:25:51

+0

好吧,我尝试了你的解决方案,但不幸的是它不工作:(我修改了与当前情况相关的问题 – Rob 2010-04-09 11:52:41

+0

在你的例子中,你已经调用了你的控制器“Controller”,它应该是你的控制器的* actual *名称 – 2010-04-09 12:33:10

1

你应该使用第二种形式的Html.BeginForm的重载形式来指定动作和控制器的使用,例如:

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

罗布,

,则应指定NAME控制器的并不仅仅是“控制器”按您编辑的代码。因此,如果您的SaveOrder操作在HomeController控制器类中,那么您应该使用:

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

对不起,这是我在代码中做的,但由于公司的限制我不允许发布确切的代码,所以我重命名了控制器。 – Rob 2010-04-09 12:48:26