我正在使用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)
答案 0 :(得分: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<Employee>
,或者您必须在操作方法签名中将其设置为Employee[]
,那么我不记得我的头脑了但是其中一个或另一个应该工作。
另请注意,在第一行,您必须确保在Inherits属性中包含命名空间:System.Web.Mvc.ViewPage<IEnumerable<Namespace1.Namespace2.Namespace3.Employee>>
,当然还要使用您的员工类具有的任何实名。
希望这有帮助。
答案 1 :(得分:0)
我认为您没有获得正确值的原因是因为您以错误的方式使用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>
<% } %>