保存模型时,部分视图列表返回null

时间:2016-08-28 18:15:55

标签: c# asp.net-mvc partial-views

我将List传递给局部视图并且工作正常,它显示所有数据,但是当我保存模型时,List返回null,我缺少什么?

  • 不要注意对象,我为这个例子写了假的。

这是cshtml:

@model ViewModels.StudentVM

@using (Html.BeginForm("SaveStudent", "StudentsView", FormMethod.Post}))
{
    @Html.AntiForgeryToken();
    <div class="row">
        <span>Student name:</span>
        @Html.TextBoxFor(s => s.Name)
    </div>
    <div>
        @Html.Partial("StudentsList", Model.Students)
    </div>
    <div class="form-group">
        <input type="submit" value="Save" class="btn">
    </div>
}

加载视图时,我让所有学生都进入了视图模型:

vm.Students = await _studentController.GetAllStudents(); // returned 20 Students.

部分视图:

@model IEnumerable<Entities.Students>

<table class="table-bordered">
    @foreach (var item in Model)
    {
        <tr>
            <td>
               @Html.CheckBoxFor(modelItem => item.IsSelected)
            </td>
            <td>
               @Html.DisplayFor(modelItem => item.Name)
            </td>
        </tr>
    }
</table>

我想让所有入选的学生,所以我想选择3名学生。 然后单击“保存”按钮。结果:尽管我选择了3名学生,但Model.Students为null。我怎样才能得到这些学生?

2 个答案:

答案 0 :(得分:1)

您当前的部分视图代码只有调用DisplayNameFor帮助程序方法,该方法仅将显示名称呈现为标签。如果要提交每个项目的数据,则需要生成与视图模型属性结构匹配的输入表单字段。

假设您的StudentVM有一个Students类型IEnumerable<Students>

的集合

如果您的HttpPost操作方法的参数属于StudentVm类型,则需要确保您的局部视图生成输入表单字段,其名称类似于&#39; Students [0] .Name , 'Students[1].Name等。您可以使用Html.TextBox帮助器方法并指定此自定义名称

@model IEnumerable<Students>
<table class="table-bordered">
    @{
        var counter = 0;
    }
    @foreach (var student in Model)
    {
        <tr>
            <th>Name</th>
            <td>@Html.TextBox("Students[" + counter + "].Name", student.Name)</td>
        </tr>
        counter++;
    }
</table>

如果您只是显示现有学生的姓名,则不需要文本字段,您只需在循环内显示这些字段即可。在这种情况下,当表单提交时,为什么你担心学生集合是null?您正在尝试保存将在.Name财产中的新学生。因此,如果您再次需要现有学生(但为什么?),您可以调用GetAllStudents方法。

答案 1 :(得分:0)

也许您在视图中使用了2种不同的模型...... 你可以在1个viewmodel中使用2个模型 这不是局部视图

pub fn play() {
    let mut game = Game::new();

    loop {
        match game.turn() {
            Ok(()) => { game.turn += 1 }
            Err(e) => println!("{}", e)
        }
    }
}

您可以在1个视图模型中传递所有数据(许多模型) :

ViewModels.StudentVM != IEnumerable<Entities.Students>