2

ASP.NET MVC 2の既定のモデルバインダー機能を使用する必要がある投稿を作成しようとしていますが、残念ながらうまくいきません。

チェックアウトボタンをクリックすると、jQueryコードを使用してフォームに動的に入力し、このフォームをサーバーに送信します。これは送信されるフォームです

<form action="/x/Order/Checkout" id="cartForm" method="post">
    <input name="__RequestVerificationToken" type="hidden" value="UDjN9RdWheKyWK5Q71MvXAbbDNel6buJd5Pamp/jx39InuyYIQVptcEubIA2W8DMUzWwnZjSGkLspkmDPbsIxy8EVuLvfCSZJJnl/NrooreouptwM/PaBEz2v6ZjO3I26IKRGZPqLxGGfITYqlf8Ow==">
    <input id="CustomerID" name="CustomerID" type="hidden" value="1">
    <input id="FirmID" name="FirmID" type="hidden" value="2">
    <input type="hidden" name="CartItems[0].ServiceTypeID" value="1">
    <input type="hidden" name="CartItems[0].Quantity" value="1">
    <input type="hidden" name="CartItems[1].ServiceTypeID" value="2">
    <input type="hidden" name="CartItems[1].Quantity" value="1">
</form>

これは、フォームの送信イベントを処理するjQueryコードです。

$("#cartForm").submit(function (event) {
    event.preventDefault();
    var form = $("#cartForm");
    var panel = form.parent();
    panel.parent().block();
    $.ajax({
        type: "post",
        dataType: "html",
        url: '<%: Url.Content("~/Order/Checkout") %>',
        async: false,
        data: form.serialize(),
        success: function (response, status, xml) {
            panel.parent().unblock();
        },
        error: function (response) {
            panel.parent().unblock();
        }
    });
});

これは、呼び出される必要があるコントローラーアクションです

[HttpPost]
[ValidateAntiForgeryToken]
public virtual ActionResult Checkout( CartModel cart ) {
}

そして最後に、これは関連するCartModelクラスです

public class CartModel : BaseModel
{
    public int CustomerID { get; set; }
    public int FirmID { get; set; }

    public List<CartItemModel> CartItems { get; set; }

    public CartModel() {
        CartItems = new List<CartItemModel>();
    }
}

public class CartItemModel : BaseModel
{
    public int ServiceTypeID { get; set; }
    public int Quantity { get; set; }
}

ただし、デフォルトのModel Binderは、WebフォームデータをCartModelクラスにバインドしません。Fiddlerを使用すると、次のスナップショットからわかるように、サーバーに送信されたデータが正しいことがわかりました。

代替テキスト

なにか提案を?

4

1 に答える 1

3

@Artem K.のコメントに続いて、コードは良さそうです。

BaseModelクラスがオブジェクトのバインドを妨げているかどうかを確認してください。また、リクエストの実行を妨げるフィルターがないことを確認してください(承認など)

于 2010-12-28T14:33:06.587 に答える