【问题标题】:Model Binding with Ajax Form与 Ajax 表单的模型绑定
【发布时间】:2010-10-05 15:59:55
【问题描述】:

我正在使用 asp.net mvc2,我正在使用 jquery 通过 ajax 提交表单。在这种情况下,模型绑定不起作用

这是我的查看代码

<%using (Html.BeginForm("MeetingTodo", "OA", FormMethod.Post, new { id = "TaskForm" }))
  {%><%=Html.Hidden("id",ViewContext.RouteData.Values["id"]) %>
    <div class="container">
    <%foreach (var val in Model.Distinct())
    { %>
            <div class="grdrow" > 
                 <div class="grdrightcaption" style="width:173px;" ><%=val.setupEmployee.EmployeeName%></div>
                 <div class="grdcells" ><%=Html.TextAreaFor(x => val.Todo, new { maxlength = 200, style="width:300px;" })%> <%=Html.HiddenFor(x => val.EmployeeID)%></div>
                <div class="grdcells" style="width:50px;" ><%=Html.CheckBoxFor(x=>val.Required)%></div>

           </div>

        <%}%>
        </div>
        <br />
        <button type="submit" class="button">save</button>                
<%}%>

以下是我在控制器中的操作方法的签名

public ActionResult MeetingTodo(IEnumerable<int> EmployeeID,IEnumerable<string> Todo, FormCollection collection, int id)

当预期 EmployeeID 和 Todo 变量包含表单中的值列表时,我在它们中找不到值。我将不胜感激任何帮助和建议

编辑一个

<FORM id=TaskForm method=post action=/OA.mvc/MeetingTodo jQuery1286197019171="1"><DIV id=tablecontainer>
<DIV class=grdcaption>
<H2>Tasks</H2></DIV>
<DIV class=grdrow>
<DIV style="WIDTH: 173px" class=grdtopcaption>Participant</DIV>
<DIV style="WIDTH: 303px" class=grdtopcaption>Todo</DIV>
<DIV style="WIDTH: 50px" class=grdtopcaption>Required</DIV></DIV><INPUT id=id value=110 type=hidden name=id> 
<DIV class=container>
<DIV class=grdrow>
<DIV style="WIDTH: 173px" class=grdrightcaption>Muhammad Adeel Zahid</DIV>
<DIV class=grdcells><TEXTAREA style="WIDTH: 300px" rows=2 cols=20 name=[0].Todo maxlength="200">Shahzad</TEXTAREA> <INPUT value=19 type=hidden name=[0].EmployeeID></DIV>
<DIV style="WIDTH: 50px" class=grdcells><INPUT value=true type=checkbox name=[0].Required><INPUT value=false type=hidden name=[0].Required></DIV></DIV>
<DIV class=grdrow>
<DIV style="WIDTH: 173px" class=grdrightcaption>Abdul Samad</DIV>
<DIV class=grdcells><TEXTAREA style="WIDTH: 300px" rows=2 cols=20 name=[1].Todo maxlength="200">Syed</TEXTAREA> <INPUT value=21 type=hidden name=[1].EmployeeID></DIV>
<DIV style="WIDTH: 50px" class=grdcells><INPUT value=true CHECKED type=checkbox name=[1].Required><INPUT value=false type=hidden name=[1].Required></DIV></DIV>
<DIV class=grdrow>
<DIV style="WIDTH: 173px" class=grdrightcaption>M. Kafayat Ullah</DIV>
<DIV class=grdcells><TEXTAREA style="WIDTH: 300px" rows=2 cols=20 name=[2].Todo maxlength="200"> Mansoor</TEXTAREA> <INPUT value=23 type=hidden name=[2].EmployeeID></DIV>
<DIV style="WIDTH: 50px" class=grdcells><INPUT value=true type=checkbox name=[2].Required><INPUT value=false type=hidden name=[2].Required></DIV></DIV>
<DIV class=grdrow>
<DIV style="WIDTH: 173px" class=grdrightcaption>Muhammad Shahzad</DIV>
<DIV class=grdcells><TEXTAREA style="WIDTH: 300px" rows=2 cols=20 name=[3].Todo maxlength="200"> Alioor</TEXTAREA> <INPUT value=26 type=hidden name=[3].EmployeeID></DIV>
<DIV style="WIDTH: 50px" class=grdcells><INPUT value=true type=checkbox name=[3].Required><INPUT value=false type=hidden name=[3].Required></DIV></DIV>
<DIV class=grdrow>
<DIV style="WIDTH: 173px" class=grdrightcaption>Syed Mansoor Ali</DIV>
<DIV class=grdcells><TEXTAREA style="WIDTH: 300px" rows=2 cols=20 name=[4].Todo maxlength="200"> Ali</TEXTAREA> <INPUT value=27 type=hidden name=[4].EmployeeID></DIV>
<DIV style="WIDTH: 50px" class=grdcells><INPUT value=true type=checkbox name=[4].Required><INPUT value=false type=hidden name=[4].Required></DIV></DIV></DIV><BR><BUTTON aria-disabled=false class="button ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" role=button type=submit jQuery1286197019171="10"><SPAN class=ui-button-text>save</SPAN></BUTTON> </DIV></FORM>

我的方法签名是这样的

public ActionResult MeetingTodo(IEnumerable<int> EmployeeID,IEnumerable<string> Todo, FormCollection collection, int id)

【问题讨论】:

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


    【解决方案1】:

    是否可以看到您的视图代码是什么样的?

    它应该看起来像这样:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Employee>>" %>
    // Other code not in your example
    <%using (Html.BeginForm("MeetingTodo", "OA", FormMethod.Post, new { id = "TaskForm" }))
    {%>
    <%=Html.Hidden("id",ViewContext.RouteData.Values["id"]) %>
    <div class="container">
    <% for (int i = 0; i < Model.Count(); ++i)
       { %>
       <div class="grdrow" > 
           <div class="grdrightcaption" style="width:173px;" >
               <%= Model[i].setupEmployee.EmployeeName%>
           </div>
           <div class="grdcells" >
               <%= Html.TextAreaFor(x => x[i].Todo, new { maxlength = 200, style="width:300px;" })%> <%= Html.HiddenFor(x => x[i].EmployeeID)%>
           </div>
           <div class="grdcells" style="width:50px;" >
               <%=Html.CheckBoxFor(x =>  x[i].Required) %>
           </div>
       </div>
    <% }%>
    </div>
    <br />
    <button type="submit" class="button">save</button>                
    <%}%>
    // Other code not in your example
    

    您的操作方法签名应如下所示:

    public ActionResult MeetingTodo(IEnumerable<Employee> Employees,
        FormCollection collection,
        int id)
    

    我不记得我是否可以将类型设置为IEnumerable&lt;Employee&gt;,或者是否必须在操作方法签名中将其设置为Employee[],但其中一个应该可以工作。

    还请注意,在第一行中,您必须确保在 Inherits 属性中包含命名空间,如下所示:System.Web.Mvc.ViewPage&lt;IEnumerable&lt;Namespace1.Namespace2.Namespace3.Employee&gt;&gt;,当然还要使用您的员工类的真实姓名。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我相信您没有得到正确值的原因是您使用了错误的 Html.TextAreaFor。代码中的 x 指向您的 Page.Model 属性,而您的 val 与 ASP.NET MVC2 可以理解的属性无关。

      您可以将代码更改为如下所示:

      <%using (Html.BeginForm("MeetingTodo", "OA", FormMethod.Post, new { id = "TaskForm" }))
      {%><%=Html.Hidden("id",ViewContext.RouteData.Values["id"]) %>
      <div class="container">
      var ix = 0;
      <%foreach (var val in Model.Distinct())
      { %>
          <div class="grdrow" > 
              <div class="grdrightcaption" style="width:173px;" ><%=val.setupEmployee.EmployeeName%></div>
              <div class="grdcells" ><%=Html.TextArea(String.Format("employee[{0}].Todo", ix), val.Todo, new { maxlength = 200, style="width:300px;" })%>
                  <%=Html.Hidden(String.Format("employee[{0}].EmployeeID", ix), val.EmployeeID)%>
              </div>
              <div class="grdcells" style="width:50px;" >
                  <%=Html.CheckBox(String.Format("employee[{0}].Required", ix), val.Required)%>
              </div>
          </div>
      <% ++ix 
      }%>
      </div>
      <br />
      <button type="submit" class="button">save</button>                
      <%}%>
      

      然后在你的动作声明中装饰你的参数如下:

      public ActionResult MeetingTodo([Bind(Prefix = "employee")]Employee[] employees)
      

      不过,更好、更清洁的方法是这样做。

      <% for (int i = 0; i < Model.Count(); ++i) 
      { %>
      <%= Html.HiddenFor(m => m[i].SomeAttribute) %>
      <div><%= Html.TextAreaFor(m => m[i].SomeTextAttribute) %></div>
      <% } %>
      

      【讨论】:

      • 感谢埃米尔的回复。我将 foreach 更改为 for。现在 EmployeeID 和 Todo 集合包含五个元素,每个元素都等于表单上的控件数量(正确)。但问题是这些集合中的条目对于 Todo 为空,对于 EmployeeID 为 0。我错过了什么?
      • 您能否发布您的标记现在的外观以及您的操作方法签名的外观?这样我也许能提供更好的帮助。
      • 编辑问题以包含 actionresult 的标记和签名。请编辑第 1 号
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      相关资源
      最近更新 更多