1

かみそりでC#、MVC 3を使用しています。囲まれたifステートメントを使用すると、リストはポストでnullになります。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

次のようにしてみてください。

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 に答える
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 に答える