Связывание модели с формой Ajax - PullRequest
0 голосов
/ 04 октября 2010

я использую asp.net mvc2 и отправляю форму через ajax с помощью jquery.в этом сценарии привязка модели не работает

Вот мой код View

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

Ответы [ 2 ]

1 голос
/ 05 октября 2010

Можно ли увидеть, как выглядит ваш код представления?

Он должен выглядеть примерно так:

<%@ 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>> и, конечно, используйте любое настоящее имя вашего класса сотрудников.

Надеюсь, это поможет.

0 голосов
/ 04 октября 2010

Я полагаю, что причина, по которой вы не получаете правильные значения, заключается в том, что вы используете 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>
<% } %>
...