2016-05-15 56 views
6

我坚持在这个问题上一会儿..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参数始终为空。

这里有什么错误?

+0

确保您使用投递到此页面<形式方法=“POST”> – adeel41

+0

尝试了一切,现在是这样的:@using(Html.BeginForm()) – mitti

+0

是Get和Post Action方法的名称是否相同?并确认你是否在你的帖子操作方法中使用了[HttpPost] – adeel41

回答

6

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

<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)。 在你情况下,应该是这样的:

@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方法,那么显然在模型的列表将有0个元素。在这种情况下,将for循环中的停止条件更改为所需的计数。

请记住,这个话题被讨论过很多次:

ASP.NET MVC bind array in model

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

+0

谢谢,已将foreach更改为for循环。我不得不将AddTranslation方法中的ViewModel参数更改为ProjectTranslation列表 - 之后,它工作。 – mitti

+0

您可以将复杂模型作为参数,不需要将其更改为列表。如果您的视图生成正确的输入名称,则内置模型联编程序将正确处理嵌套属性。 –

+0

使用foreach循环代替for循环是给我的问题。 –