1

テーブル内からでも、MVC 3のアイテムのリストをモデルバインドする方法に関するさまざまな記事を見つけることができますが、各例では、行はリスト内のレコードを表しています。私の見解の要件は、各レコードが列でなければならないということです。次の記事からは、どのトリックも機能しません。

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ http://dotnetslackers.com/articles/aspnet/Understanding-ASP- NET-MVC-Model-Binding.aspx#s8-binding-with-a-list-of-class-types

これが私の見解の関連部分です:

    <table>
        <thead>
            <tr>
                <th>Name</th>
@foreach (var fact in Model.Facts)
{
                <th>@fact.Name</th>
}
            </tr>
        </thead>
        <tr>
            <td>Value</td>
@foreach (var fact in Model.Facts)
{
            <td>@Html.TextBox("Value" + fact.FactID.ToString(), fact.Value)</td>
}
        </tr>
        <tr>
            <td>Sample</td>
@foreach (var fact in Model.Facts)
{
            <td>@Html.TextBox("Sample" + fact.FactID.ToString(), fact.Sample)</td>
}
        </tr>
        <tr>
            <td>Default?</td>
@foreach (var fact in Model.Facts)
{
            <td>@Html.RadioButton("Default", fact.FactID, fact.Default)</td>
}
        </tr>
        <tr>
            <td></td>
@foreach (var fact in Model.Facts)
{
            <td>@Html.ActionLink("Detail", "Details", "Fact", new { id = fact.FactID }, null)</td>
}
        </tr>
    </table>

フォームのアクション後のメソッドでは、手動でデータを引き出すFormCollectionを受け入れています。代わりに、IListコレクションを受け入れて、MVCモデルバインダーにすべてを理解させたいと思います。

これが私のコントローラーのアクションです:

[HttpPost]
[Authorize]
public RedirectToRouteResult Facts(FormCollection form)
{
    int factListId = int.Parse(form["FactListID"]);
    FactList factList = Repository.Find(factListId);
    int defaultId = int.Parse(form["Default"]);
    foreach (Fact fact in factList.Facts)
    {
        string factId = fact.FactID.ToString();
        string toParse = form["Value" + factId];
        fact.Value = toParse.Length == 0 ? null : new Nullable<double>(double.Parse(toParse));
        fact.TextValue = form["Value" + factId];
        toParse = form["Sample" + factId];
        fact.Sample = toParse.Length == 0 ? null : new Nullable<int>(int.Parse(toParse));
        fact.Default = (fact.FactID == defaultId);
    }
    Repository.Save();
    return RedirectToAction("Index");
}

誰かが私を正しい方向に向ける何かを手に入れましたか?そこには情報があると思いますが、これを行う方法についての膨大な量の情報では、レコードごとに1行のより「標準的な」情報を見つけることができません。

ありがとう

4

1 に答える 1

3

IListがある場合は、このようなことを行うとうまくいくはずです。数値インデックスによって入力を生成する場合は、ポストでそれらをバインドするのに十分な情報をMVCに提供します。

@for (int i = 0; i< Model.Facts.Count(); i++)
{
      <td>@Html.TextBoxFor(m => m.Facts[i].Value)</td>
}

<--! Do other fields the same way -->

コントローラのポストアクションは、ViewModelと同じタイプのパラメータを受け入れる必要があります。次に、ファクトIListが正しくバインドされていることを確認する必要があります。

于 2012-06-04T20:54:15.750 に答える