【问题标题】:Binding a list of string to View将字符串列表绑定到视图
【发布时间】:2016-11-28 18:48:47
【问题描述】:

好的,这很简单,但我做不到>:(

我的视图模型

public List<string> Answers = new List<string>();

我的观点

    @for (int i = 0; i < 4; i++)
    {
        <div class="form-group">
            @Html.TextBoxFor(x => x.Answers[0], new { @class = "form-control" })
        </div>
    }

我收到错误:

索引超出范围。必须是非负数且小于集合的大小。 参数名称:索引

这到底是怎么回事?

编辑: 即使我尝试这个,它也不会绑定并且我没有在我的控制器中获取值。

    @for (int i = 0; i < 4; i++)
    {
        <div class="form-group">
            <input type="text" name="Answers[@i]" value="" />
        </div>
    }

【问题讨论】:

  • 好像答案是空的
  • @MongZhu 是的,它是空的。我在这里要做的是,它显示了 4 个文本框。当我发布表单时,它会用每个文本框的值填充该列表。这是这样做的方法吗?
  • 我创建了一个小提琴 here,它似乎按预期工作
  • 将 4 个项目的集合传递给视图并使用 @for (int i = 0; i &lt; Model.Answers.Count; i++) - 但这不是这样做的方法,除非您始终要求填写所有 4 个文本框。

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5


【解决方案1】:

您需要先填充列表...类似于:

public List<string> Answers = new List<string>();

foreach(var thing in Something){

Answers.Add(thing);

}

【讨论】:

  • 我用 Answers[i] 替换了您的 Answers[0]
  • 好的,我知道你把'i'放在那里但情况不一样,我得到“索引超出范围。必须是非负数并且小于集合的大小。”错误。
  • 你如何填写“答案”列表
【解决方案2】:

您需要在视图顶部添加@model ModelName。没有这个,它就不会知道你试图循环的是什么。在您的模型中将答案设为属性,在视图顶部添加 @model ModelWithAnswers 并迭代该属性。

【讨论】:

    【解决方案3】:

    正如其他人指出的那样,索引超出范围是因为您引用了集合中不存在的元素。

    解决该问题,确保您的迭代器受元素约束,例如:

    @for (int i = 0; i < Model.Answers.Count; i++)
    {
        <div class="form-group">
            @Html.TextBoxFor(x => x.Answers[i], new { @class = "form-control" })
        </div>
    }
    

    如果您的模型中没有答案,您将不会看到任何文本框。根据您的描述,我假设您至少需要 4 个,因此请确保在构建模型时使用空字符串或空值填充模型。

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2023-04-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      相关资源
      最近更新 更多