通过Ajax

时间:2017-05-19 16:15:08

标签: c# jquery ajax asp.net-mvc

我有一个表格,用户可以在其中输入与Schedule模型对应的几个字段。他们还可以从User的下拉列表中选择Schedule。要将所有必需的数据发送到视图,我的ViewModel包含一个Schedule和一个包含系统中所有用户的IEnumerable<SelectListItem>

在我的控制器中,我创建List SchedulingViewModels。然后我将List<SchedulingViewModel>传递给PartialView(我只包括相关部分):

@model List<JNEScheduling.Models.SchedulingViewModel>

...

<tbody>
@for (int i = 0; i < Model.Count; i++)
{
    <tr>
        <td>
            @Html.HiddenFor(m => m[i].ID)
            @Html.DropDownListFor(m => m[i].schedule.UserID, Model[i].users)
         </td>
         <td>
             @Html.TextBoxFor(m => m[i].schedule.hours)
         </td>
         <td>
             @Html.TextBoxFor(m => m[i].schedule.week_ending)
         </td>
         </tr>
  }
   <tr>
</tbody>

然后我通过Ajax将PartialView加载到我的View中。装载工作正常。但是,当表单为POST时,它会将一个空的Schedule对象列表传递给Controller,而不是按预期方式将填充的SchedulingViewModel对象列表传递给Controller。

我认为它与表单上所有输入的DOM名称有关;它们采用[index].schedule.hours等形式。如何传回调度视图模型对象列表?或者甚至填充ListSchedule个对象也是细

POST的Jquery:

 $('#submitButton').click(function () {
    var content = $("form").serialize();
    $.ajax({
        type: 'POST',
        url: '@Url.Action("Table", "Schedule")',
        data: content,
        success: function (data) {
            $('#hoursTable').html(data);
    }
});

更新: 在使用Brian GET之后,来自PartialView的Ajax SchedulingContainerViewModel生成的表格的一行。我删除了@Html方法生成的验证标记:

<tr>
    <td>
        <input name="Items[0].ID" type="hidden" value="0" />
        <select name="Items[0].schedule.UserID">
            <option selected="selected" value="1">User 1</option>
            <option value="2">User 2</option>
            <option value="3">User 3</option>
            <option value="4">User 4</option>
            <option value="5">User 5</option>
        </select>
    </td>
    <td>
        <input name="Items[0].schedule.hours" type="text" value="40.00" />
    </td>
    <td>
            <input name="Items[0].schedule.week_ending" type="text" value="5/26/2017 12:00:00 AM" />
    </td>
</tr>

更新2 :传回的XHR数据:XHR Data for Ajax POST

1 个答案:

答案 0 :(得分:1)

命名结构看起来正确。 SOmetimes,而不是使用列表,我添加一个包装类,如:

public class ScheduleContainerViewModel
{
   public List<SchedulingViewModel> Items { get; set;}
}

会呈现:

Items[index].schedule.hours

我使用这种方法,它适用于我的项目。