ASP.NET MVC 5模型绑定列表为空

时间:2016-05-15 12:15:10

标签: c# asp.net-mvc-5

我坚持这个问题一段时间..

我创建了一个简单的视图模型:

public class AddTranslationViewModel
{
    public List<ProjectTranslation> ProjectTranslations { get; set; }
    public AddTranslationViewModel()
    {
        ProjectTranslations = new List<ProjectTranslation>();
    }
}

ProjectTranslation类:

public class ProjectTranslation
{
    public int ProjectTranslationId { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Address { get; set; }

    public int LanguageId { get; set; }
    public Language Language { get; set; }

    public int ProjectId { get; set; }
    public Project Project { get; set; }

}

使用AddTranslationViewModel

的简单视图
<table class="table">

    @foreach (var item in Model.ProjectTranslations)
    {
        @Html.HiddenFor(modelItem => item.ProjectTranslationId)
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Language.LanguageCode)
            </td>
            <td>
                @Html.EditorFor(modelItem => item.Title)
            </td>
        </tr>
    }

</table>
<input type="submit" value="Send" />

最后我的POST方法:

    public ViewResult AddTranslation(AddTranslationViewModel projectTranslations)
    {
        if (ModelState.IsValid)
        {
           //...
        }
        return View(projectTranslations);
    }

这个想法非常基础,我想展示一个可以更改/编辑值的项目列表。

但是,模型绑定不起作用,HTTPPost-Method AddTranslation中的projectsTranslations参数始终为空。

这里的错误是什么?

1 个答案:

答案 0 :(得分:8)

绑定到对象列表需要创建名称包含索引的输入字段结构,即:

<input type="text" name="YourArrayOrList[0].SomeProperty" value="123" />
<input type="text" name="YourArrayOrList[0].SomeOtherProperty" value="321" />
<input type="text" name="YourArrayOrList[1].SomeProperty" value="123" />
<input type="text" name="YourArrayOrList[1].SomeOtherProperty" value="321" />

此外,您需要使用Razor的Html.BeginFrom方法(see documentation)将表单指向Controller中的正确操作方法。 在你的情况下它应该是这样的:

@using(Html.BeginForm("AddTranslation","YourControllerName"))
{
    for (int i=0;i<Model.ProjectTranslations.Count; i++)
    {
        @Html.HiddenFor(model => model.ProjectTranslations[i].ProjectTranslationId)
        <tr>
            <td>
                @Html.DisplayFor(model => model.ProjectTranslations[i].Language.LanguageCode)
            </td>
            <td>
                @Html.EditorFor(model => model.ProjectTranslations[i].Title)
            </td>
        </tr>
    }
}

如果你的方法不是编辑,而是CREATE方法,那么显然你的模型中的List将有0个元素。在这种情况下,请将for循环中的停止条件更改为所需的计数。

请记住,此主题之前已多次讨论过:

ASP.NET MVC bind array in model

ASP.NET MVC - Can't bind array to view model