Ajaxified ссылка в MVC3 / JQuery не работает в IE8 (отсутствует заголовок) - PullRequest
1 голос
/ 05 мая 2011

Рассмотрим следующий код (он основан на проекте EMPTY MVC3 по умолчанию, созданном в Visual Web Developer Express 2010sp1):

_Layout.cshtml:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
</head>
<body>
    <div id="header">header</div>
    <div id="main">@RenderBody()</div>
</body>
</html>

Метод индекса HomeController:

public ActionResult Index()
{
    if (Request.IsAjaxRequest())
    {
        ViewBag.Message = "partial";
        return PartialView();
    }
    else
    {
        ViewBag.Message = "full";
        return View();
    }
}

Index.cshtml:

<script type="text/javascript">
    $(function () {
        $('#myLink').click(function () {
            $.post(this.href, function (result) {
                $('#main').html(result);
                alert(result);
            });
            return false;
            //$('#main').load(this.href);
            //return false;
        });
    });
</script>

HomeController index. @ViewBag.Message
@Html.ActionLink("Index", "Index", new { controller = "Home" }, new { id = "myLink" } );

Проблема в том, что в IE8 при щелчке по ссылке myLink он не обновляет основной div только частичным html из Index.cshtml, а полным html, включая макет. Конечно, он хорошо работает в FF, я имею в виду, почему не должно быть правильно? Кажется, Request.IsAjaxRequest () всегда оценивается как ложное в IE8. Я понимаю, что это результат того, что заголовок X-Requested-With не прикреплен к запросу в IE8. У меня нет большого опыта в веб-разработке - это общая проблема и как (лучше) решить эту проблему?

UPDATE:

Вчера у меня все нормально работало в IE8, но когда я попробовал это сегодня утром, та же проблема вернулась. Теперь я не думаю, что это больше связано с настройками в IE8, так как я восстановил настройки до значений по умолчанию. Я попытался изучить запрос с помощью инструмента Fiddler. Для того чтобы я мог захватывать трафик с localhost с помощью fiddler, я добавил точку по адресу: http://localhost.:3157/. Так что теперь ошибка возникает только тогда, когда я использую http://localhost.:3157/ (с точкой), и она работает нормально, когда я использую http://localhost:3157/ (без точки). Я дополнительно протестировал поведение в Chrome, Opera и Safari - ссылка ajax работает нормально в этих браузерах. Обратите внимание, что я могу заставить его работать нормально в IE8, когда я присоединяю параметр запроса к ссылке ajax, например:

@Html.ActionLink("Index", "Index", new { controller = "Home", param = "param" }, new { id = "myLink" } )

Я действительно не хочу этого делать. У меня кончаются идеи здесь. Я, вероятно, упускаю что-то, что является очевидным для опытного веб-разработчика =] Кто-нибудь распознает эти симптомы?

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Возможно, вы захотите использовать метод .live() вместо .click ():

$('#myLink').live('click', function () {
    ...
    return false;
});

, потому что вы заменяете DOM в обратном вызове AJAX (#main)который содержит ссылку, поэтому вы убиваете назначенный вами обработчик событий.

Также у вас есть опечатка в сценарии jquery, включенном в <head>.Вам не хватает закрывающего > после type="text/javascript":

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>

Итак, вот полный рабочий пример:

_Layout.cshtml:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>

</head>
<body>
    <div id="header">header</div>
    <div id="main">@RenderBody()</div>
</body>
</html>

HomeController:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        if (Request.IsAjaxRequest())
        {
            ViewBag.Message = "partial";
            return PartialView();
        }
        else
        {
            ViewBag.Message = "full";
            return View();
        }
    }
}

Index.cshtml:

<script type="text/javascript">
    $(function () {
        $('#myLink').click(function () {
            $.post(this.href, function (result) {
                $('#main').html(result);
            });
            return false;
        });
    });
</script>

HomeController index. @ViewBag.Message
@Html.ActionLink("Index", "Index", new { controller = "Home" }, new { id = "myLink" } )
0 голосов
/ 05 мая 2011

добавьте

jQuery.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    }
});

, чтобы убедиться в правильности заголовка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...