如何正确迭代元素?

时间:2018-07-10 15:09:20

标签: html asp.net-mvc collections

我正在迭代我的Model.Payments集合(这是public IEnumerable<Payments> Payments { get; set; }):

@using (Html.BeginForm())
{
    <div class="payments">
        @foreach (var payment in Model.Payments)
        {
            Html.RenderPartial("_Payment", payment);
        }
    </div>

    <input type="submit" value="Aggiorna" />
}

这是我的_Payment部分:

@model MyProject.Models.Payments

<div class="payment-row">
    <span>ActivityID:</span> @Html.TextBoxFor(x => x.ActivityID)
    <span>PaymentType:</span> @Html.TextBoxFor(x => x.PaymentType)
    <span>Amount:</span> @Html.TextBoxFor(x => x.Amount)
</div>

但是它不能创建正确的HTML。名称/ ID相同,因此回发后就无法检索数据。

我在哪里错了?

1 个答案:

答案 0 :(得分:1)

正确的方法是使用EditorFor()方法,该方法将为您的输入正确加上集合索引器

将部分视图重命名为Payments.cshtml(以匹配类的名称),然后将其移至/Views/Shared/EditorTemplates(或/Views/YourControllerName/EditorTempatesFolder

然后您看到的变成

@using (Html.BeginForm())
{
    <div class="payments">
        @Html.EditorFor(m => m.Payments)
    </div>
    <input type="submit" value="Aggiorna" />
}

EditorFor()方法会为集合中的每个项目生成正确的html,并将生成诸如<input name="Payments[0].ActivityID" ... />之类的输入,而不是您当前正在生成的<input name="ActivityID" ... />

作为旁注,您应该考虑使用@Html.LabelFor()来生成与表单控件相关联的<label>,而不是使用<span>