【问题标题】:Model binding postback data to a controller action parameter of type List<T>模型将回发数据绑定到 List<T> 类型的控制器操作参数
【发布时间】:2010-03-08 09:43:55
【问题描述】:

我对类型有一个强类型视图

List<List<MyViewModelClass>>

外部列表总是有两个List&lt;MyViewModelClass&gt; 列表。对于两个外部列表中的每一个,我想显示一组复选框。每个集合可以有任意数量的选择。

我的视图模型类看起来像这样:

public class MyViewModelClass
{
    public Area Area { get; set; }

    public bool IsGeneric { get; set; }

    public string Code { get; set; }

    public bool IsChecked { get; set; }
}

所以最终的视图看起来像:


请选择适用的:

第一组选择:

  • x 选项 1
  • x 选项 2
  • x 选项 3

第二组选择:

  • x 第二个选项 1
  • x 第二个选项 2
  • x 第二个选项 3
  • x 第二个选项 4

复选框应显示MyViewModelClass.Area.Name,其值应与MyViewModelClass.Area.Id 相关。检查状态当然与MyViewModel.IsChecked有关。

问题

我想知道如何使用Html.CheckBox()Html.CheckBoxFor() 助手来显示我的复选框?当然,我必须在回发时将这些值返回到服务器。

我希望我的控制器操作类似于以下之一:

public ActionResult ConsumeSelections(List<List<MyViewModelClass>> data)
{
    // process data
}

public ActionResult ConsumeSelections(List<MyViewModelClass> first, List<MyViewModelClass> second)
{
    // process data
}

如果它使事情变得更简单,我可以创建一个单独的视图模型类型,例如:

public class Options
{
    public List<MyViewModelClass> First { get; set; }

    public List<MyViewModelClass> Second { get; set; }
}

以及将我的第一个控制器操作版本更改为:

public ActionResult ConsumeSelections(Options data)
{
    // process data
}

【问题讨论】:

    标签: asp.net-mvc-2 viewmodel model-binding generic-list


    【解决方案1】:

    通常我创建一个类型(模型)来“建模”我想要创建的视图。 即

    public class FooViewModel
    {
        public List<Option> General { get; set; }
        public List<Option> Others { get; set; }
    
        //Some Methods and other properties
    }
    public FooController :...
    {
        private FooViewModel fooViewModel = new FooViewModel();
    }
    

    编辑: 看看this post,这正是你想要的!

    【讨论】:

    • 好的。这只是一个视图模型(我也提出了我的问题)。您如何使用其中的数据?显示数据很简单,但是当您希望带有复选框的 FORM 返回服务器时,如何将数据放在视图上。
    • 我更新了我的帖子,添加了一个我认为您正在寻找的帖子的链接。
    • 在某种程度上确实如此,但最终还是自定义绑定。我编辑了我的问题以包括我的操作方法...
    【解决方案2】:

    解决方案

    事实证明这根本没有那么复杂。您所要做的就是适当地命名您的控件,所有内容都将按应有的方式绑定在一起。所以。无论您的控件是什么,它们都应始终命名为:

    name="first[0].propName"
    name="first[1].propName"
    name="first[2].propName"
    name="first[3].propName"
    ...
    
    // or
    name="first[0].data[0].property"
    name="first[0].data[1].property"
    name="first[0].data[2].property"
    ...
    name="first[1].data[0].property"
    name="first[1].data[1].property"
    ...
    

    所有这些都将绑定到List&lt;SomeType&gt; first 控制器动作参数(第二个在一个集合中有另一个集合)。

    非常重要的提示
    如果您使用 Javascript 动态添加/删除这些控件,则必须确保索引从 0 开始是连续的,并且没有任何间隙。您将拥有一个运行良好的应用程序,其中包含动态数量的集合中的元素。

    您也可以在my blog post 中了解它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多