【问题标题】:MVC : Model does not submit for multiple formsMVC:模型不提交多个表单
【发布时间】:2011-08-18 06:05:53
【问题描述】:

这与 ASP.Net MVC 2 相关

我有一个模型 (MoviesForAll) 绑定到我的视图,这个模型有一个 ICollection 类的集合。我希望我的用户通过单击提交按钮“购买此票”一次购买单张票,因此我在代表票详细信息的每一行旁边放置了一个按钮。这导致以下序列

<%@Page Title="title" Language="C#" MasterPageFile="~/Views/Shared/MyMaster.Master" 
Inherits="System.Web.Mvc.ViewPage<OnlineBooking.Movies.MoviesForAll>">

<Table>
  <% for(i=0; i<Model.Tickets.count; i++)
  { %>
  <tr>
      <% using (Html.BeginForm(myaction(), FormMethod.Post, new {id="myform"})) 
         { %>
           <td>
             <%= Model.tickets[i].ticketID %>
             <%= Html.HiddenFor(m=>m.tickets[i].ticketID) %>
           </td>
           <td>
             <%= Model.tickets[i].seatNo %>
             <%= Html.HiddenFor(m=>m.tickets[i].seatNo) %>
           </td>
           ...
           ...
           <td>
             <input type="submit" value="buy this ticket" runat="server">
           </td>
      <% } %>
  </tr>
  <% } %>
</table>

这会为每行带有单个提交按钮的工单创建一个表单。

问题是,当我通过单击按钮提交第一行(索引为 0)时,它会正确提交,并且我可以在控制器方法中看到值。但是即使我使用隐藏字段绑定它,也没有其他行通过控制器。

我是否遗漏了特定于索引或其他内容的内容?

提前谢谢..

【问题讨论】:

    标签: asp.net-mvc-2 model-binding


    【解决方案1】:

    我建议为所有行使用一个表单,然后在每一行上使用按钮元素而不是输入,如下所示:

    <button type="submit" value="<%= Model.tickets[i].ticketID %>" name="buyticket">Buy this ticket</button>
    

    您的控制器操作上应该有一个名为 buyticket 的参数,并且应该有被点击按钮的票证 ID

    【讨论】:

      【解决方案2】:

      以下内容如何:

      <table>
        <% for(i = 0; i < Model.Tickets.Count; i++) { %>
        <tr>
            <% using (Html.BeginForm("myaction", FormMethod.Post, new { id = "myform" })) { %>
              <td>
                 <%= Model.tickets[i].ticketID %>
               </td>
               <td>
                 <%= Model.tickets[i].seatNo %>
               </td>
               ...
               ...
               <td>
                 <%= Html.Hidden("TicketId", Model.tickets[i].ticketID) %>
                 <%= Html.Hidden("SeatNumber", Model.tickets[i].seatNo) %>
                 <input type="submit" value="buy this ticket" />
               </td>
            <% } %>
        </tr>
        <% } %>
      </table>
      

      然后:

      public class TicketToPurchaseViewModel
      {
          public int TicketId { get; set; }
          public int SeatNumber { get; set; }
      }
      

      和行动:

      [HttpPost]
      public ActionResult myaction(TicketToPurchaseViewModel ticket)
      {
          ...
      }
      

      备注:请注意,我还从提交按钮中删除了runat="server" 属性,因为这是您绝对不希望在 ASP.NET MVC 应用程序中看到的内容。

      【讨论】:

      • 从您的帖子中,我看到两个更改作为解决方案 1. 将所有隐藏字段集体移动到最后,2. 删除 runat = server 属性。我说的对吗?
      • @Anil Soman,是的。我还用Html.Hidden 替换了Html.HiddenFor 助手,并引入了控制器操作将执行的视图模型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多