【问题标题】:For loop for textboxes in mvcmvc中文本框的for循环
【发布时间】:2026-01-26 17:00:01
【问题描述】:

我目前设置了一个可以工作的 for 循环。但是,当我尝试返回带有此error 的页面时,问题就出现了。 我试图让它最初呈现两个他们需要填写的参考资料,如果他们想为这个页面添加最多两个额外的参考资料,总共 4 人。这是我目前正在使用的代码。 这是页面视图:

    <div id="reference-list">
        @for (int i = 0; i < Model.Order.References.Count; i++)
        {
            <div class="reference nomination-person" id="reference-@i">

                    <h3>Reference @(i+1)</h3>

                    <div class="person-attribute">
                        @Html.LabelFor(m => m.Order.References[i].Prefix)
                        @Html.DropDownListFor(m => m.Order.References[i].Prefix, new SelectList(prefixes))
                    </div>

                    <div class="person-attribute">

                        @Html.LabelFor(m => m.Order.References[i].FirstName)
                        @Html.TextBoxFor(m => m.Order.References[i].FirstName)
                        @Html.ValidationMessageFor(m => m.Order.References[i].FirstName)
                    </div>

                    <div class="person-attribute">
                        @Html.LabelFor(m => m.Order.References[i].MiddleName)
                        @Html.TextBoxFor(m => m.Order.References[i].MiddleName)
                    </div>

                    <div class="person-attribute">
                        @Html.LabelFor(m => m.Order.References[i].LastName)
                        @Html.TextBoxFor(m => m.Order.References[i].LastName)
                        @Html.ValidationMessageFor(m => m.Order.References[i].LastName)
                    </div>

                    <div class="person-attribute">
                        @Html.LabelFor(m => m.Order.References[i].Suffix)
                        @Html.DropDownListFor(m => m.Order.References[i].Suffix, new SelectList(suffixes))
                    </div>

                    <div class="person-attribute">
                        @Html.LabelFor(m => m.Order.References[i].Company)
                        @Html.TextBoxFor(m => m.Order.References[i].Company)
                    </div>

                    <div class="person-attribute">
                        @Html.LabelFor(m => m.Order.References[i].EmailAddress)
                        @Html.TextBoxFor(m => m.Order.References[i].EmailAddress)
                        @Html.ValidationMessageFor(m => m.Order.References[i].EmailAddress)
                    </div>

                    <div class="person-attribute">
                        @Html.LabelFor(m => m.Order.References[i].Telephone)
                        @Html.TextBoxFor(m => m.Order.References[i].Telephone)
                        @Html.ValidationMessageFor(m => m.Order.References[i].Telephone)
                    </div>

            </div>
        }
    </div>
    <input type="hidden" name="n-references" id="n-references" value="0" />


    <div id="add-reference">Add Reference</div>

控制器

    private OrderData GetReferencesData(OrderData data, HttpRequestBase request)
    {
         data.References = new List<Person>();
        /* Since there can be many references, iterate along all and create individual 
         * persona objects for each */

        for (int i = 0; i <= request["n-references"].ToInt(); i++)
        {
            data.References.Add(new Person
            {
                Prefix = request["Order.Prefix-" + i] ?? "",
                Suffix = request["Order.Suffix-" + i] ?? "",
                FirstName = request["Order.FirstName-" + i] ?? "",
                MiddleName = request["Order.MiddleName-" + i] ?? "",
                LastName = request["Order.LastName-" + i] ?? "",
                Company = request["Order.Company-" + i] ?? "",
                Telephone = request["Order.Telephone-" + i] ?? "",
                EmailAddress = request["Order.EmailAddress-" + i] ?? ""
            });
        }

        return data;
    }

虽然在模型中它只是 public List&lt;Person&gt; References;

【问题讨论】:

  • 尝试将for循环的结束条件改为@for (int i = 1; i &lt; Model.Order.References.Count(); i++)
  • 这不允许他们一次添加超过 4 个引用吗?放入 4 的原因是它不允许向页面添加更多内容。
  • 尽管您声称 目前可行 - 它永远不会正确绑定。在将模型传递给视图之前,您需要在控制器中初始化对象并使用for (int i = 0; i &lt;= Model.Order.References.Count; i++) { @Html.DropDownListFor(m =&gt; m.Order.References[i].Prefix, ....) 等。如果您想在视图中动态添加更多对象,请参阅this answer
  • @StephenMuecke 我将代码更新为我尝试过的。你说我需要在控制器中初始化我的对象,但我不太确定你的意思是什么,所以我也包括了我的控制器。
  • 不清楚您在编辑后的代码中尝试做什么(您的GetReferencesData() 方法没有意义,并且请求永远不会包含任何值,例如request["Order.Prefix-" + i])。在控制器中,初始化您的模型并添加 2 个默认对象,例如 model.Order.References.Add(new Reference()); 并将该模型返回到视图。

标签: c# asp.net-mvc for-loop textbox


【解决方案1】:

您的 m.order.references 中的元素少于 4 个。因此,当您在索引上点击 3 或 4 时,它会超出参考数组边界并给您一个错误。在尝试访问数组中的点之前,您应该检查 m.order.references 的长度

编辑 m.order.references 是一个列表/数组(出于我们的目的,这些是可互换的),这个对象将包含有限数量的项目,我们的示例假设它有 3 个项目。当您遍历列表时,如果您尝试在现场访问 m.order.references[4] 的项目,您将得到一个超出范围的异常。发生这种情况是因为位置 4 没有项目。您需要做的是

for(int i = 0; i &lt;= m.order.references.count; i++) 如果你想证明他们只能有 4 个引用,你需要更改你的架构以拥有一个新的引用数组和一个现有的引用数组(或其他东西,因为你当前的设计不支持这个)

【讨论】:

  • 我觉得我不太明白你在说什么。您能否详细说明您的最后一句话?