Позвольте мне сначала поместить сюда фрагменты кода. Я просто использую проект ASP.NET MVC, который Visual Studio создает из коробки. Поэтому я просто добавляю к нему отрывки:
Раздел Site.master head:
<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 обратно, что выполняет перенаправление и вызывает другой запрос на получение, но это не асинхронно. Opera тоже не работает, поэтому я предполагаю, что это та же проблема. Однако приведенный выше код отлично работает в IE 8, Chrome и Safari.
На localhost все вышеперечисленные браузеры работают должным образом, включая Firefox и Opera - все они получают «Получен запрос ajax!» как ответ от сервера.
У кого-нибудь есть идеи, что здесь происходит и как это исправить? Я ищу реальное решение или хотя бы объяснение того, что происходит и почему.
2 ответа
Так что игра со Fiddler помогла разобраться в этой проблеме. Вот что происходило:
URI в вызове $ .get заставлял его не находить метод действия, который я указал в своем вопросе, что сервер возвращал 302. Как только Firefox (и Opera) получили 302 от сервера, они оба попытались использовать "/ Home / TestAjax / "(с косой чертой в конце). Однако на этот раз в заголовке HTTP не было X-Request-With, установленного на «XMLHttpRequest». Итак, в TestAjax()
метод действия Request.IsAjaxRequest()
был ложным, поэтому я получил ответ «не-ajax-запрос».
С другой стороны, IE, Safari и Chrome работали по той причине, что в перенаправленном запросе у них все еще был X-Request-With, установленный на «XMLHttpRequest». Для меня до сих пор остается загадкой, почему этого не произошло в Firefox и Opera, но сейчас я не буду об этом беспокоиться.
Совершенно глупо с моей стороны упускать из виду конечную косую черту, но я понятия не имел, что она так важна!
Принятый дизайн методов действий - возвращать ActionResult а>. В вашем случае вы возвращаете строку. Попробуйте вместо этого:
public ActionResult TestAjax()
{
if (Request.IsAjaxRequest())
{
return Content("Got ajax request!", "text/plain");
}
return View();
}
Похожие вопросы
Новые вопросы
asp.net-mvc
ASP.NET MVC Framework - это платформа и инструмент веб-приложений с открытым исходным кодом, которые реализуют версию шаблона модель-представление-контроллер (MVC), адаптированную к веб-приложениям и построенную на основе технологии ASP.NET.