2010-10-04 6 views
0

J'utilise asp.net mvc2 et je soumets un formulaire via ajax en utilisant jquery. dans ce travail modèle de scénario de liaison neLiaison de modèle avec Ajax Form

Voici mon point de vue Code

<%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>     
<%}%> 

ci-dessous est la signature de ma méthode d'action dans le contrôleur

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

je ne trouve pas les valeurs des variables RéfEmployé et Todo quand on s'attend à ce qu'ils contiennent la liste de valeurs du formulaire. Je vous saurais gré de toute aide et suggestions

Modifier un

<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> 

et ma signature de la méthode est comme

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

Répondre

1

Est-il possible de voir à quoi ressemble votre code de vue?

Il devrait ressembler à ceci:

<%@ 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 

Et votre signature de la méthode d'action devrait ressembler à ceci:

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

Je ne me souviens pas du haut de ma tête si vous pouvez définir le type à IEnumerable<Employee> ou si vous devez le définir à Employee[] dans la signature de la méthode d'action, mais l'un ou l'autre devrait fonctionner. Notez également que sur la première ligne, vous devez vous assurer que vous incluez l'espace de noms dans l'attribut Inherits en tant que tel: System.Web.Mvc.ViewPage<IEnumerable<Namespace1.Namespace2.Namespace3.Employee>> et bien sûr utilisez le nom réel de votre classe d'employés.

Espérons que cela aide.

0

Je crois que la raison pour laquelle vous ne pas obtenir les valeurs correctes est parce que vous êtes en utilisant Html.TextAreaFor dans le mauvais sens. Le x dans votre code pointe vers votre attribut Page.Model alors que votre val n'est pas lié à cet attribut d'une manière que ASP.NET MVC2 peut comprendre.

Vous pouvez changer votre code pour ressembler à ceci:

<%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>     
<%}%> 

Et puis dans votre déclaration d'action décorer vos paramètres comme suit:

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

Une meilleure et plus propre moyen serait de faire ceci cependant.

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

Merci pour votre réponse Emil. J'ai changé foreach pour. maintenant les collections EmployeeID et Todo contiennent cinq éléments chacun égal au nombre de contrôles sur le formulaire (correct). mais le problème est que les entrées dans ces collections sont null pour Todo et 0 pour EmployeeID. Je manque quelque chose? –

+0

Pourriez-vous poster à quoi ressemble votre balisage maintenant ainsi que la signature de votre méthode d'action? Je pourrais peut-être aider mieux de cette façon. –

+0

Modifié la question pour qu'elle contienne le balisage et la signature du résultat d'action. plz c éditer no 1 –