使用if语句时,Binded list会在post中给出null结果

时间:2012-11-12 20:59:25

标签: c# asp.net-mvc-3 razor if-statement model-binding

我正在使用C#,MVC 3使用剃须刀 使用环绕的if语句时,列表在空格中为空。没有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>
        }
    }

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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输出,我会在必要时进行更正。

答案 2 :(得分: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)
    }
}