【问题标题】:ASP.NET MVC - Prevent Double Form PostingASP.NET MVC - 防止双重表单发布
【发布时间】:2010-10-28 21:14:06
【问题描述】:

我有一个 ASP.NET MVC 表单,但其中的数据需要通过 jQuery 发布(不是 ajax)。使用普通模型无法提交,因为Controller Action需要一个JSON字符串,而获取该字符串的唯一方法是使用jQuery的$.post方法将数据转成JSON,然后将其发布到控制器。

这很好用。然而最终结果是,在发布后,表单应该重定向到不同的页面(如成功页面)。这不会发生,它只是停留在同一页面上。

如果我使用 return false;在我的 jQuery 代码中,它会阻止表单再次尝试发布,但这并不能解决我的问题。我也真的不想手动设置 URL,因为我想尽可能多地避免使用 javascript。

控制器

    [HttpPost]
    public ActionResult Receive([FromJson] jsonObject item)
    {
        if (ModelState.IsValid)
        {
                       // logic
        }
        return RedirectToAction( ... );
    }

JavaScript

            $('.submit').click(function(e) {
                    var json = JSON.stringify(data);
                    $.post( location.href, { item: data});
            });

这将正确提交代码。如果我在调试器中单步执行 return 语句,它甚至会被命中,但它永远不会重定向。我能做什么?

【问题讨论】:

  • 将表单序列化为 json,将此值放入隐藏输入并调用 document.forms["myform"].submit()。它将进行常规调用,而不是 ajax 调用。

标签: jquery asp.net-mvc


【解决方案1】:

如何从您的操作中返回一个字符串,该字符串是您要重定向到的位置。

然后在您的成功回调中,通过设置window.location 使用javascript 重定向方法。

例如注意:这是未经测试的,可能不会像这样完全工作,但你明白了。

控制器

[HttpPost]
public ActionResult Receive([FromJson] jsonObject item)
{
    if (ModelState.IsValid)
    {
                   // logic
    }
    return Json("urltoredirectto");
}

JavaScript

$('.submit').click(function(e) {
    var json = JSON.stringify(data);
    $.post(location.href, { item: data },
        function (data) {
            window.location = data;
        });
});

HTH,
查尔斯

【讨论】:

  • 为什么 return 在第一次被击中时不执行?为什么我已经在 Controller 中完成了,还需要在 javascript 中返回?
  • 因为来自 Ajax 调用的响应不会发送到浏览器(它会导致重定向发生),而是会发送到您的 javascript 代码并被吞下,因为您对结果什么都不做张贴。
【解决方案2】:

嗯,$.post 是一个 ajax 命令,所以它收到的结果是重定向请求。这意味着浏览器不会收到请求,因为 ajax 命令正在使用它。

我发现这可能会有所帮助: Use jQuery to attach JSON to a form and submit it

【讨论】:

    猜你喜欢
    • 2015-03-11
    • 2017-01-18
    • 2023-04-09
    • 2012-04-05
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多