【问题标题】:Asp.Net MVC 2 - Iterate Through Form Values In Model BinderAsp.Net MVC 2 - 遍历模型绑定器中的表单值
【发布时间】:2010-03-30 16:31:37
【问题描述】:

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

<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; }
}

因此,每个 ListItem 都应转换为 MyModelItem,其 id 等于输入 id 末尾的数字,值设置为输入字段上的值。

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

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

【问题讨论】:

    标签: asp.net-mvc modelbinders


    【解决方案1】:

    如果您想遍历表单值,请使用 Request.Form。

    【讨论】:

    • 是的,这似乎是唯一的方法。尽管伪造请求变量涉及覆盖 HttpContextBase 和 HttpRequestBase 类,但这会使模型绑定器的测试变得混乱。另外,我觉得我在这里遗漏了一些东西。他们一定是出于某种原因删除了此功能,对吧?我在做不该做的事吗?
    • 该功能已被删除,因为它具有限制性。它强制所有值提供者都是可枚举的,而实际上某些值提供者(如指向任意对象的值提供者)是不能枚举的。在像您这样的情况下,您知道数据在 Request.Form 中,并且您甚至不知道正确的键,直到运行时,反对 Request.Form 是正确的解决方案。在您的情况下,ValueProvider 只是一个不必要的抽象。
    【解决方案2】:

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

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

    【讨论】:

    • 不,ModelState 不保存已发布的表单值:-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2010-12-20
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多