1

我正在使用带有剃须刀的 C#、MVC 3 使用环绕的 if 语句时,post 中的列表为空。没有if,它工作正常。我需要的是包含文本框中所有值的列表。

for (var i = 0; i < Model.Budget.BudgetRader.Count; i++)
    {
        if (Model.Budget.BudgetRader[i].Konto != -1) { 
            <tr>
                <td>@Html.TextBoxFor(x => x.Budget.BudgetRader[i].BudgetBelopp)</td>
            </tr>
        }
    }
4

3 回答 3

2

Phil Hack描述了它不起作用的原因。

索引集合需要 0 及以上的索引值增加 1 并且不跳过任何索引值。因此,当您使用 if 语句跳过某些行时,绑定不起作用。添加一个特定的索引器 i ,如果您的行需要是唯一的,请添加一个隐藏字段 Id 或类似的。请参阅下面的更新示例。

int i = 0;
foreach (var rad in Model.Budget.BudgetRader)
{
    if (rad.Konto != -1)
    {
        <tr>
            <td>@Html.HiddenFor(x => x.Budget.BudgetRader[i].Id)</td>
            <td>@Html.TextBoxFor(x => x.Budget.BudgetRader[i++].BudgetBelopp)</td>
        </tr>
    }
    else
    {
        //...
    }
}

以下堆栈溢出也是很好的信息:https ://stackoverflow.com/a/8896840/455904

于 2012-11-12T21:23:02.320 回答
1

尝试Index对每个项目使用显式值。这允许您在集合中拥有非顺序索引:

for (var i = 0; i < Model.Budget.BudgetRader.Count; i++)
{
    if (Model.Budget.BudgetRader[i].Konto != -1) { 
        <tr>
            <td>
                <input type="hidden" name="Budget.BudgetRader.Index" value="@i" /> 
                @Html.TextBoxFor(x => x.Budget.BudgetRader[i].BudgetBelopp)
            </td>
        </tr>
    }
}

这是一个类似的答案:https ://stackoverflow.com/a/8598287/1373170

我不确定是否Budget.BudgetRader.Index是正确的名称,因为它应该与您的收藏名称相同。如果您发布当前的 html 输出,我会在必要时进行更正。

于 2012-11-13T00:03:16.980 回答
1

尝试做这样的事情:

for (var i = 0; i < Model.Budget.BudgetRader.Count; i++)
{
    if (Model.Budget.BudgetRader[i].Konto != -1) { 
        <tr>
            <td>@Html.TextBoxFor(x => x.Budget.BudgetRader[i].BudgetBelopp)</td>
        </tr>
    }
    else
    {
        @Html.HiddenFor(x => x.Budget.BudgetRader[i].BudgetBelopp)
    }
}
于 2012-11-13T00:21:00.243 回答