如何绑定包含字典列表的视图模型

本文关键字:列表 字典 视图 模型 包含 何绑定 绑定 | 更新日期: 2023-09-27 18:10:38

我有我的ViewModel看起来像这样:

public class ParentViewModel
{
    public IList<ChildViewModel> Children { get; set; }
    public IList<AttributeViewModel> Attributes { get; set; }
}
public class ChildViewModel
{
    public IDictionary<int, bool> Attributes { get; set; }
}
public class AttributeViewModel
{
    public int AttributeId { get; set; }
    public string Description { get; set; }
}

对应的视图是这样的:

@for (var i = 0; i < Model.Children.Count; i++)
{
    for (var j = 0; j < Model.Attributes.Count; j++)
    {
        var attribute = Model.Attributes[j];
        @Html.DisplayFor(model => model.Attributes[j].Description)
        @Html.CheckBoxFor(model => model.Children[i].Attributes[attribute.AttributeId])
    }
}

当我尝试对我的控制器动作做这个视图的post back时,我得到一个InvalidCastException。我在MVC中做的是可能的吗?


作为参考,这里是我对应的控制器:

public class TestController : Controller
{
    public ActionResult Index()
    {
        return View("Index", new ParentViewModel
        {
            Attributes =
                new List<AttributeViewModel>
                {
                    new AttributeViewModel { AttributeId = 1, Description = "green" },
                    new AttributeViewModel { AttributeId = 2, Description = "spicy" }
                },
            Children = new[] { new ChildViewModel() }
        });
    }
    public ActionResult PostBack(ParentViewModel model)
    {
        // Does not work. Fails immediately
        return RedirectToAction("Index");
    }
}

And my View:

@model ParentViewModel
@{
    Layout = null;
}
@using (Html.BeginForm("PostBack", "Test", FormMethod.Post))
{
    for (var i = 0; i < Model.Children.Count; i++)
     {
         for (var j = 0; j < Model.Attributes.Count; j++)
         {
             var attribute = Model.Attributes[j];
             @Html.DisplayFor(model => model.Attributes[j].Description)
             @Html.CheckBoxFor(model => model.Children[i].Attributes[attribute.AttributeId])
         }
     }
    <input type="submit"/>
}

如何绑定包含字典列表的视图模型

如果这些是常规类而不是字典,我知道For循环和Razor语法看起来会有所不同。也许如果你试着用这个语法来建模你的循环之类的东西,它就会起作用。

 for (int i = 0; i < Model.listModel.Count; i++)
    {
          @Html.TextBoxFor(modelItem => Model.listModel[i].LastName)    
        for (int m = 0; m < Model.listModel[i].anotherListObj.Count; m++)
        {
              @Html.TextBoxFor(modelItem => Model.listModel[i].anotherListObj[m].FirstName)
        }
    }
编辑:

@Html.CheckBoxFor(model => model.Children[i].Attributes[attribute.AttributeId])    

上面的代码看起来像是在尝试将一个属性列表转换为一个属性字典

我的循环语法也适用于期望'SomeModel'的视图,定义如下

SomeModel
{
  List<ListClass> listModel {get;set;}
}
ListCLass
{
  List<yetAnotherList> anotherListObj {get; set};
}