現在、ページに JSON オブジェクトがあり、ユーザーがアイテムを追加すると構築されます。これはすべて JavaScript/jQuery で行われます。
ユーザーが項目の追加を完了したら、このオブジェクトをコントローラー アクションに POST し、アクションがこのデータを使用して厳密に型指定されたビューを返すようにします。
現在、jQuery.ajax POST がこの JSON オブジェクトをアクション メソッドに送信し、アクション メソッドがこのオブジェクトを強く型付けされたモデルにバインドしています。問題は、JSON オブジェクトが FORM にあり、単に送信されているかのように、この jQuery.ajax POST をリダイレクトすることです。
また、バインディングが正しく機能するように contentType を「application/json」に設定できるようにする必要があるため、必要に応じてリダイレクトする jQuery.post() メソッドも使用できません。残念ながら、jQuery.post() メソッドでは、このパラメーターを設定できません。
jQuery.post() メソッドは基本的に jQuery.ajax() メソッドを使用することを読んだので、jQuery.ajax() メソッドをリダイレクトするために戦ってきました。
また、すべての jQuery.ajax() メソッドにデフォルトの contentType を設定できることも読みました。これにより、jQuery.post() メソッドを使用できるようになりますが、可能であればこれを回避したいと考えています。
ありがとう
編集:Saedeasの提案で更新:
「インデックス」ビューの私の JavaScript:
<script language="javascript" type="text/javascript">
// Initialize the Shopping Cart object
var m_ShoppingCart = {
UserId: 10,
DeliveryInstructions: "Leave at front desk",
CartItems: []
};
$(document).ready(function () {
$.extend({
postJSON: function (url, data, callback) {
return $.ajax({
type: "POST",
url: url,
data: JSON.stringify(data),
success: callback,
dataType: "json",
contentType: "application/json",
processData: false
});
}
});
});
function PostDataWithRedirect() {
var url = '@Url.Action("ConfirmOrder", "Store")';
$.postJSON(url, m_ShoppingCart, function () { });
}
function AddToCart(id, itemName, price, quantity) {
// Add the item to the shopping cart object
m_ShoppingCart.CartItems.push({
"Id": id,
"ItemName": itemName,
"Price": price.toFixed(2), // Issue here if you don't specify the decimal place
"Quantity": quantity
});
// Render the shopping cart object
RenderShoppingCart();
}
function RenderShoppingCart() {
$("#CartItemList").html("");
var totalAmount = 0;
$.each(m_ShoppingCart.CartItems, function (index, cartItem) {
var itemTotal = Number(cartItem.Price) * Number(cartItem.Quantity);
totalAmount += itemTotal;
$("#CartItemList").append("<li>" + cartItem.ItemName + " - $" + itemTotal.toFixed(2) + "</li>");
});
$("#TotalAmount").html("$" + totalAmount.toFixed(2));
}
</script>
そして、コントローラーアクション「ConfirmOrder」
[HttpPost]
public ActionResult ConfirmOrder(ShoppingCartModel model)
{
return View(model);
}
したがって、PostDataWithRedirect() JavaScript メソッドが呼び出されると、ConfirmOrder コントローラー アクションにヒットし、ConfirmOrder ビューにリダイレクトされる必要があります。インデックス ビューのショッピング カート オブジェクトは完全に JavaScript で構築されており、ユーザーが [チェックアウトに進む] ボタンをクリックすると、リダイレクトされます。
PS: 私の完全な動作例は、記事 [ How to POST a JSON object in MVC ] にあります。上記で説明したように、投稿とリダイレクトを実行できるように、このコードを更新する必要があります。