$ .ajax()。成功不仅仅适用于firefox

时间:2014-10-23 16:11:51

标签: ajax asp.net-mvc cross-domain

我有一个像这样的ajax函数:

function RunSubmit() {
        $.ajax({
            url: '@Url.Action("Contact", "Public")',
                type: "POST",
                data: $('#contactForm').serialize(),
                dataType: 'jsonp',
                crossDomain: true,
                success: function (result) {
                    alert("hit success function");
                    if (result.validForm) {
                        alert("At redirect. Url is: " + result.url);
                        window.location.assign(result.url);
                        //console.log("valid form");
                    } else {
                        $('#registerForForm').html(result);
                        //console.log("BAD FORM");
                        alert("ELSE CALLED");
                    }
                },
                error : function(ob1, ob2, ob3)
                {
                },
                complete: function(val)
                {
                    //This is being hit but it appears no value is being returned from the controller (FireFox)

                }
            });  

奇怪的是它适用于IE和Chrome但不适用于FF。我尝试使用dataType: 'json'运行帖子而不使用dataType且没有crossDomain属性。看看FF上的控制台我可以看到我们有很多跨域请求错误主要来自谷歌字体。 (这不会发生在chrome或ie)。在我们的控制器中,我们正在向另一台主机上的另一台服务器发出硬编码的http请求,以便我可以看到问题可能出现的位置。我们之前处理此问题的方法是将crossdomain.xml文件添加到项目的根目录中。像这样的东西

<?xml version="1.0" encoding="utf-8" ?>
<cross-domain-policy>
  <allow-access-from domain="*.xyz.com"/>
  <allow-access-from domain="*.abc.com"/>
  <allow-access-from domain="*.123.net"/>
  <allow-access-from domain="http://university.abc.com"/> //this is the site we are sending a request to in our controller
</cross-domain-policy>  

所以我搜索并在SO上发现多个帖子,其中没有在ajax帖子上调用成功函数。检查我的error个对象,我收到的唯一信息是&#34;错误&#34;。这个javascript应该收到一个网址并重定向;但是,它正在做的是将JSON返回值呈现给屏幕。

enter image description here

这是从我们的控制器返回Json的代码行。

return Json(new { validForm = true, url = "/Public/ContactComplete" }, JsonRequestBehavior.AllowGet);  

该行看起来很好,返回的Json是完美的json所以它不应该是jquery方面的解析错误。

1 个答案:

答案 0 :(得分:0)

这是一个有趣的情况。我将此添加到我的原因列表中,为什么表单可能不会在MVC中回发。我们聘请开发产品的外部公司创造了一个“黑客”产品。如果您希望在单击按钮本身时禁用提交按钮(以防止双重发布),则可以解决Chrome无法回发的问题。为了解决这个问题,开发人员编写了一个ajax脚本,在点击时手动提交表单。这反过来又炸毁了firefox中的功能。有一些奇怪的双重发布,无论出于什么原因,FF会将JSON渲染到屏幕上,而不是抓住Json并运行成功函数。

长话短说:

如果您要禁用提交按钮以防止双重发布,请在表单提交事件中禁用它。

伪代码

$('#submit-button').on('click', function() { this.attr('disabled', true);}  

不是要走的路。以下是为我修复它的原因

$('form').on('submit', function() { $('#submit-button').attr('disabled', true);}