发布JSON并提交表单(或重定向)

时间:2012-10-24 14:34:12

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在努力解决如何正确提交表单,我真的只需要发送JSON而不是表单控件。我有一个SubmitOrder()javascript函数:

function SubmitOrder() {
    var selectedProductsAsJson = JSON.stringify(selectedProducts);
    // This line works...
    $.post('/OrderCheckout/Save', { jsonData: selectedProductsAsJson });
    // ... or this line works...
    $('#productListForm').submit();
    // but not both lines together.
}

我要做的是将selectedProductsAsJson发送到我的控制器,处理它,然后将用户发送到新页面。 $ .post行完成前两个操作,但我不知道如何在此之后将用户发送到新页面。

如果我只是执行.submit()行,则会将用户重定向到新页面,但控制器没有要处理的json数据。

如果我使用两行,$ .post调用是异步的,用户将在$ .post调用完成之前结束新表单。我读here我可以使$ .post调用同步,但似乎我应该可以通过一次调用服务器完成所有这些操作。为实现这一目标,我错过了什么?

我的控制器目前看起来像这样;

public class OrderCheckoutController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public void Save(string jsonData)
    {
        List<Product> selectedProducts = new JavaScriptSerializer().Deserialize<List<Product>>(jsonData);
        decimal totalPrice = selectedProducts.Sum(x => x.Price);
        ViewBag.SaleTotal = totalPrice;
    }
}

2 个答案:

答案 0 :(得分:3)

您可以使用$.post

的成功回调函数(第三个参数)

“成功网址”可以是硬编码的,也可以来自您的POST(Save)操作(实际上是无效的,但可能是JsonResult)

$.post('/OrderCheckout/Save', 
       { jsonData: selectedProductsAsJson }, 
        function() {
          $('#productListForm').submit();
        }
      );

答案 1 :(得分:1)

public ActionResult Save(string jsonData)
{
    List<Product> selectedProducts = new JavaScriptSerializer().Deserialize<List<Product>>(jsonData);
    decimal totalPrice = selectedProducts.Sum(x => x.Price);
    ViewBag.SaleTotal = totalPrice;
    return RedirectToAction("Index");
}

OR

$.post('/OrderCheckout/Save', { jsonData: selectedProductsAsJson }, 
        function() {
          $('#productListForm').submit();
        }
);