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

mit*_*tti 8 c# asp.net-mvc-5

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

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

public class AddTranslationViewModel
{
    public List<ProjectTranslation> ProjectTranslations { get; set; }
    public AddTranslationViewModel()
    {
        ProjectTranslations = new List<ProjectTranslation>();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

一个使用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" />
Run Code Online (Sandbox Code Playgroud)

最后我的POST方法:

    public ViewResult AddTranslation(AddTranslationViewModel projectTranslations)
    {
        if (ModelState.IsValid)
        {
           //...
        }
        return View(projectTranslations);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

这里的错误是什么?

Mar*_*cki 9

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

<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" />
Run Code Online (Sandbox Code Playgroud)

此外,您需要使用Razor Html.BeginFrom方法将窗体指向Controller中的正确Action 方法(请参阅文档).在你的情况下,它应该是这样的:

@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>
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

ASP.NET MVC在模型中绑定数组

ASP.NET MVC - 无法绑定数组以查看模型