MVC绑定对象中的对象列表

时间:2017-10-10 17:02:04

标签: c# asp.net-mvc model-binding

我正在尝试动态构建一个需要在表单提交时绑定到ViewModel的表。

第一项是表单提交的动作。然后是Parent ViewModel,然后是子ViewModel。下面是两个代表我需要绑定的数据的文本字段。

当我提交表单时,页面中的所有其他字段都绑定到它们各自的属性,但ProgramViewModels的复杂对象不是。

我错过了什么?

public ActionResult Add(AddEntityViewModel viewModel){
 Code that does something
}

 public class AddEntityViewModel
    {
    public IList<int> Counties { get; set; }
    public IList<ProgramViewModel> Programs { get; set; }
    public IList<int> Regions { get; set; }
    public string EntityName { get; set; }

    public bool IsValid()
    {
        if (string.IsNullOrEmpty(EntityName))
            return false;

        if (Counties == null || Counties.Count == 0)
            return false;

        if (Programs == null || Programs.Count == 0)
            return false;

        if (Regions == null || Regions.Count == 0)
            return false;

        return true;
    }
}

public class ProgramViewModel
{
    public int Id;
    public string SystemId;
}

<input type="hidden" id="Programs[0]__Id" name="Programs[0].Id" data-programid="3" value="3">
<input type="text" id="Programs[0]__SystemId" name="Programs[0].SystemId" style="width:100%" maxlength="50">

更新

在adiga的回答之后将字段更改为属性。但这也没有解决问题。

public class ProgramViewModel
{
    public int Id { get; set; }
    public string SystemId { get; set; }
}

2 个答案:

答案 0 :(得分:2)

您的ProgramViewModel包含字段。将它们更改为属性。

public class ProgramViewModel
{
    public int Id { get; set; }
    public string SystemId { get; set; }
}

DefaultModelBinder使用反射并仅绑定属性而不绑定字段。

答案 1 :(得分:0)

如果你有一个对象列表,你应该执行foreach指令来获取所有对象:

<% foreach(var x in values) { %>
<div>hello <%= x.name %></div>
<% } %>