Jquery $ .get против ASP.NET MVC не работает в Opera и Firefox - PullRequest
1 голос
/ 11 марта 2010

Позвольте мне сначала поместить фрагменты кода здесь. Я просто использую проект ASP.NET MVC Visual Studio создает из коробки. Поэтому я просто добавляю фрагменты, которые я добавил к нему:

Раздел сайта 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, но это не так асинхронный. Опера тоже не работает, поэтому я предполагаю, что это та же проблема. Однако приведенный выше код прекрасно работает в IE 8, Chrome и Safari.

На локальном хосте все вышеперечисленные браузеры работают должным образом, включая Firefox и Opera - все они получают "Got ajax request!" как ответ от сервера.

У кого-нибудь есть идеи, что здесь происходит и как это исправить? Я ищу реальное решение или хотя бы объяснение того, что происходит и почему.

Ответы [ 2 ]

1 голос
/ 13 марта 2010

Так что игра с Фиддлером помогла разобраться в этой проблеме.Вот что происходит:

URI в вызове $ .get заставлял его не находить метод действия, который я указал в своем вопросе, что сервер возвращает 302. Как только Firefox (и Opera) получили302 с сервера, они оба пытались использовать "/ Home / TestAjax /" (с косой чертой в конце).Однако на этот раз в заголовке HTTP не было установлено значение X-Request-With «XMLHttpRequest».Таким образом, в TestAjax() метод действия Request.IsAjaxRequest() был ложным, поэтому я получил «Non-Ajax запрос» как ответ.

С другой стороны, причина, по которой IE, Safari и Chrome работали, заключается в том, чтов перенаправленном запросе они все еще имели X-Request-With, установленный на «XMLHttpRequest».Для меня до сих пор остается загадкой, почему Firefox и Opera этого не сделали, но я не собираюсь беспокоиться об этом на данный момент.не знаю, что это так важно!

0 голосов
/ 11 марта 2010

Принятый дизайн методов действия должен возвращать ActionResult . В вашем случае вы возвращаете строку. Попробуйте вместо этого:

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