【问题标题】:Jquery $.get against ASP.NET MVC not working in Opera and Firefox针对 ASP.NET MVC 的 Jquery $.get 在 Opera 和 Firefox 中不起作用
【发布时间】:2010-03-11 04:55:13
【问题描述】:

我先把代码sn-ps放在这里。我只是在使用 Visual Studio 开箱即用的 ASP.NET MVC 项目。所以我只是把我添加的sn-ps:

Site.master 的头部部分:

<head runat="server">
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
    <script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="../../Scripts/test.js" type="text/javascript"></script>
    <script type="text/javascript">$(document).ready(ready);</script>
</head>  

test.js 的内容:

function ready(){
 $.get("/Home/TestAjax", ajaxResponse);
}

function ajaxResponse(data){
    alert("got response from server: " + data);
}

HomeController 中的方法:

        public String TestAjax()
        {
            if (Request.IsAjaxRequest())
            {
                return "Got ajax request!";
            }
            else
            {
                return "Non-ajax request";
            }
        }

现在我在 Firefox 3.5.30729 (Firebug) 中看到的问题是,当 ajax 请求发出时,远程框上的 IIS 7 发送回 Http 302,它执行重定向并强制另一个 get 请求,但事实并非如此异步。 Opera 也不起作用,所以我认为这是同样的问题。但是,上面的代码在 IE 8、Chrome 和 Safari 中运行良好。

在 localhost 上,所有上述浏览器都按预期工作,包括 Firefox 和 Opera——它们都收到“Got ajax request!”作为服务器的响应。

任何人都知道这里发生了什么以及如何解决它?我正在寻找一个真正的解决方案,或者至少解释发生了什么以及为什么。

【问题讨论】:

  • 您是否尝试过使用 Fiddler/Wireshark 来更好地了解请求/响应?
  • @Pierreten:我们说话的时候我在搞砸它。如果有任何新发现,我会在这里发布。

标签: asp.net-mvc firefox jquery opera


【解决方案1】:

所以玩 Fiddler 确实有助于解决这个问题。这是发生了什么:

$.get 调用中的 URI 导致它找不到操作方法,我在我的问题中指出服务器正在返回 302。一旦 Firefox(和 Opera)从服务器获得 302,他们都尝试了使用“/Home/TestAjax/”(末尾带有斜线)。但是,这次 HTTP 标头没有将 X-Request-With 设置为“XMLHttpRequest”。所以在TestAjax() 动作方法Request.IsAjaxRequest() 是假的,因此我得到了“非ajax 请求”作为响应。

另一方面,IE、Safari 和 Chrome 正常工作的原因是它们在重定向请求中仍然将 X-Request-With 设置为“XMLHttpRequest”。对于 Firefox 和 Opera 为何没有这样做,我仍然是个谜,但我现在不会担心。

忽略结尾的正斜杠真是太愚蠢了,但我不知道它如此重要!

【讨论】:

    【解决方案2】:

    动作方法的可接受设计是返回ActionResult。在您的情况下,您将返回一个字符串。试试这个:

    public ActionResult TestAjax()
    {
        if (Request.IsAjaxRequest())
        {
            return Content("Got ajax request!", "text/plain");
        }
        return View();
    }
    

    【讨论】:

    • 我看不出我的问题和你的建议有任何联系,这完全不相关。 ActionResult 是一个包装器,可利用 ASP.NET MVC 为您生成标记的能力。但是,在 IMO 中,返回一个代表 JSON 块或 XHTML 等的字符串就很好了,我手动生成了。
    • 不,这不好。您没有设置正确的内容类型,这是错误的设计,可能对 jQuery 不明确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多