1

ユーザーが入力する同じアイテムの数をユーザーが指示できるいくつかの要素を含む、ユーザーが入力するデータ入力フィールドのヒープ全体を含むフォームがあります。これは、Phil Haack のブログ エントリModel Binding To A Listで使用されているものです。

JQuery を使用して追加のフォーム要素を作成したり、正しくインデックスを作成したりしています。私の問題は、コントローラー内でこれらを実際に読み取るための最良の方法です。この記事の Controller は 1 つのオブジェクトのみを想定していますがIList<Product>、私の Controller は既に を想定してFormCollection formおり、現在はそれを も送信しようとしてIList<Itmes>います。

これをコントローラーが期待するパラメーターに追加するか、フォーム ["items"] などを介してアクセスする必要がありますか?

意見

<form action="/MyItems/Add" method="post">
   <input type="text" name="Title" value="" />

   <input type="hidden" name="myItem.Index" value="0" />
   <input id="item[0].Amount" name="item[0].Amount" type="text" value="" />
   <input id="item[0].Name" name="item[0].Name" type="text" value="" />

   <input type="hidden" name="myItem.Index" value="1" />
   <input id="item[1].Amount" name="item[1].Amount" type="text" value="" />
   <input id="item[1].Name" name="item[1].Name" type="text" value="" />
</form>

コントローラ

public ActionResult Add(FormCollection form)
{
    string Title = form["Title"];
    List<Item> Items = form["items"].ToList();
}

DTO

public class Item()
{
    int Amount {get; set; };
    string Name {get; set; };
}
4

3 に答える 3

1

次のように myItem をパラメーターとして追加するだけです。

public ActionResult Add(FormCollection form, List<Item> myItem)
{
}

次に、フォーム データから自動的にバインドし、myItem パラメーターを設定します。

于 2009-01-16T01:25:56.337 に答える
1

一部のデータを使用して渡され、他のデータがフレームワークによってリストにマップされてFormCollection水を濁らせるのではなく、のみで作業することにしました。FormCollection以下のコードは、アイテムを受け取り、DTO を手動でハイドレートします。これはうまく機能し、コード内でリストに直接マッピングすることができなかったいくつかの他のことを行うことができます。

List<Item> itemList = new List<Item>();
int i = 0;

while ( form["item[" + i + "].Amount"] != null)
{
    itemList.Add(new Item()
        {
            Amount = Convert.ToInt32(form[String.Format("item[{0}].Amount",i )]),
            Name = form[String.Format("item[{0}].Name",i )]
        });
}
于 2009-01-16T04:15:18.447 に答える
-1

私はこれを試していないので、試してみる必要がありますが、UpdateModel または TryUpdateModel メソッドを使用してみませんか? これは、IList をコントローラーのアクションに渡すのと同じ方法でバインドする必要があります。

あれは:

public ActionResult Add(FormCollection form)
{
    List<Item> items = new List<Item>();
    TryUpdateModel(items, form);
}

私は自分の開発用コンピューターを使用していないため、動作するかどうかはわかりませんが、動作するはずです。それが必要かどうか教えてください。

編集: エンティティ フレームワークを使用している場合、UpdateModel メソッドで多くの問題に遭遇し、独自のメソッドを作成することに頼ったことに注意してください。

于 2009-01-16T11:47:28.530 に答える