Asp.net mvc Asp.NETMVC2-在模型绑定器中迭代表单值

Asp.net mvc Asp.NETMVC2-在模型绑定器中迭代表单值,asp.net-mvc,modelbinders,Asp.net Mvc,Modelbinders,我的表格中有一个项目列表,名称如下 <input type="text" id="ListItem1" name="ListItem1"> <input type="text" id="ListItem2" name="ListItem2"> <input type="text" id="ListItem3" name="ListItem3"> 我想创建一个自定义模型绑定器,将这些转换为具有此结构的模型 public class MyModel {

我的表格中有一个项目列表,名称如下

<input type="text" id="ListItem1" name="ListItem1">
<input type="text" id="ListItem2" name="ListItem2">
<input type="text" id="ListItem3" name="ListItem3">

我想创建一个自定义模型绑定器,将这些转换为具有此结构的模型

public class MyModel
{
  public IEnumerable<MyModelItem> Items {get; set;}
}

public class MyModelItem
{
  public int Id { get; set; }
  public string Value { get; set; }
}
公共类MyModel
{
公共IEnumerable项{get;set;}
}
公共类MyModelItem
{
公共int Id{get;set;}
公共字符串值{get;set;}
}
因此,每个ListItem都应转换为MyModelItem,id等于输入id末尾的数字,值设置为输入字段上的值

在ASP.Net MVC 1.0中,我可以迭代
bindingContext.ValueProvider.Keys
集合,并检查
key.StartsWith(“ListItem”)
以查找此格式的所有输入项


ASP.Net MVC 2中的新IValueProvider接口没有密钥集合,我无法迭代该接口如何访问这些在ASP.Net MVC 2中设计时只知道前缀的值?

您可以使用bindingContext.ModelState.Keys集合吗

更新
对不起,应该再清楚一点。我的意思是,您不能使用ModelState.Keys集合,请检查key.StartsWith(“ListItem”),如果是,请使用该键从值提供程序(使用GetValue方法)获取值。

如果要迭代表单值,请使用Request.form。

不,ModelState不保存已发布的表单值:-(是的,这似乎是实现这一点的唯一方法。这使得测试模型绑定器变得混乱,尽管伪造请求变量涉及覆盖HttpContextBase和HttpRequestBase类。此外,我觉得我在这里遗漏了一些东西。他们一定是出于某种原因删除了此功能,对吗?我是否正在做我应该做的事情dn不在做什么?该功能已被删除,因为它受到限制。它强制所有值提供程序都是可枚举的,而实际上有些值提供程序(如指向任意对象的值提供程序)无法枚举。在像您这样的情况下,您知道数据在Request.Form中,并且在运行时之前您甚至不知道正确的键,这与请求背道而驰。Form是正确的解决方案。ValueProvider在您的情况下只是一个不必要的抽象。