编辑上的多选和表单绑定

时间:2013-01-05 21:34:24

标签: asp.net asp.net-mvc-4 model-binding

我在编辑模型时遇到问题,该模型包含链接的其他模型的集合。 我正在使用模型类的强类型视图:

   public class GroupViewModel
   {
       public GroupViewModel()
       {
           Group = new Group();
           Sections = new List<Section>();
       }

       public Group Group { get; set; }
       public IEnumerable<Section> Sections { get; set; }
   }

在控制器的Edit方法中,我用正确的数据填充两个字段并将其传递给视图。正确显示我的viewmodel的视图,多重选择出现并填充了传递的数据,与Group相同。

但是在我将其发送回表单提交后,我在ModelState中得到了一个恐怖,类似“从类型'System.String'到类型'Myapp.Models.Section'的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。

ASP.NET是否正确处理子集合,或者我需要使用旧的FormCollection处理它?<​​/ p>

UPD:由于Section是class而且应用程序无法将解析的int转换为Section,并且可能无法从客户端获取某些字段(实际上,仅使用Id和Name进行多选,但是省略了其他字段)?

UPD1:作为临时解决方案,我将代码更改为

   public class GroupViewModel
   {
       public GroupViewModel()
       {
           Group = new Group();
           Sections = new List<Section>();
       }

       public Group Group { get; set; }
       public IEnumerable<int> SectionsIds { get; set; }      //here
       public IEnumerable<Section> SectionsDS { get; set; }   //as here
   }

在视图中我绑定它:

@Html.ListBoxFor(x => x.SectionIds,
    new MultiSelectList(Model.SectionsDS, "Id", "Name"));

检索视图模型后,同步2个集合 - 手动虚拟导航和ID。

1 个答案:

答案 0 :(得分:0)

阅读本文 - http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

在您看来

,例如:

@for (int i = 0; i < items.Count(), i++)
{
   Html.TextBoxFor(m => m[i].Foo1);
   Html.TextBoxFor(m => m[i].Foo2);
}