ASP.NET MVC 5模型绑定列表为空 [英] ASP.NET MVC 5 model binding list is empty
问题描述
我在这个问题上停留了一段时间.
I stuck on this issue for a while..
我创建了一个简单的视图模型:
I've created a simple view model:
public class AddTranslationViewModel
{
public List<ProjectTranslation> ProjectTranslations { get; set; }
public AddTranslationViewModel()
{
ProjectTranslations = new List<ProjectTranslation>();
}
}
ProjectTranslation类:
ProjectTranslation class:
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的简单视图
A simple view which uses the 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方法:
and finally my POST Method:
public ViewResult AddTranslation(AddTranslationViewModel projectTranslations)
{
if (ModelState.IsValid)
{
//...
}
return View(projectTranslations);
}
这个想法很基础,我想显示一个项目列表,在其中应该可以更改/编辑值.
The idea is very basic, I want to show a list of items where it should be possible to change/edit the values.
但是,模型绑定不起作用,HTTPPost-Method AddTranslation中的projectsTranslations参数始终为空.
However, the model binding is not working, the projectsTranslations param in the HTTPPost-Method AddTranslation is always empty.
这是怎么了?
推荐答案
绑定到对象列表需要创建名称包含索引的输入字段结构,即:
Binding to a list of object requires creating input field structure with names containing indexes, i.e:
<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
方法(
Moreover, you need to point the form to the proper Action Method in your Controller using Razor's Html.BeginFrom
method (see documentation).
In you case it should look like this:
@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循环中的停止条件更改为所需的计数.
请记住,这个主题之前已经讨论过很多次了:
Keep in mind that this topic was discussed many times before:
这篇关于ASP.NET MVC 5模型绑定列表为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!