27

[私はこれを自分で解決しました。原因については私の回答を参照してください]

適切に設定されたコントローラー メソッドで IList<> 引数のフォーム値を取得するのに問題があります。

私のコントローラークラスは次のようになります。

public class ShoppingBasketController : Controller {

    public ActionResult Index() {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Add(IList<ShoppingBasketItem> items) {
        Session["basket"] = items; // for testing
        return RedirectToAction("Index");
    }
}
public class ShoppingBasketItem {
     public int ItemID;
     public int ItemQuantity;
}

わずかにトリミングされたフォーム:

<% using (Html.BeginForm("Add", "ShoppingBasket")) { %>
    <% int codeIndex = 0;
    foreach (Product product in products) { %>
        <%= Html.Hidden("items[" + codeIndex + "].ItemID", product.Id) %>
        <%= Html.TextBox("items[" + codeIndex + "].ItemQuantity", "0", new { size = "2"}) %>
        <% codeIndex++;
    }
} %>

次のようなマークアップが生成されます。

<form action="/Basket/Add" method="post">
    <input id="items[0]_ItemID" name="items[0].ItemID" type="hidden" value="1" />
    <input id="items[0]_ItemQuantity" name="items[0].ItemQuantity" size="2" type="text" value="0" />

    <input id="items[1]_ItemID" name="items[1].ItemID" type="hidden" value="2" />
    <input id="items[1]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" />

    <input id="items[2]_ItemID" name="items[2].ItemID" type="hidden" value="3" />
    <input id="items[2]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" />
</form>

送信されたフォームの値を確認しましたが、正しい値です。sの正しい数ShoppingBasketItemも ] に入れられますが、それぞれのとのSession["basket"両方がゼロです。フォーム値のリストを正しくデコードしているように見えますが、プロパティ自体を取得していません。ItemIDItemQuantity

私は MVC RC2 を使用しており、Scott Hanselman の記事に基づいて、私のコードが正しいと確信しています。何か不足していますか?

4

1 に答える 1

35

解決

MVC ソースをダウンロードした後も、それが機能しない理由がわかりませんでした。そのため、バインドしようとしていた型に関係があるに違いないと推測しました。案の定、プロパティではなくメンバー変数である値が原因でした。これは、モデル バインダーがリフレクションを使用してプロパティを設定するためTypeDescriptor.GetProperties(Type)です。

値クラスをこれに更新すると解決しました(何時間も壁にぶつかった後、追加する必要があります!!):

public class ShoppingBasketItem {
    public int ItemID { get; set; }
    public int ItemQuantity { get; set; }
}
于 2009-03-17T10:59:35.657 に答える