开发者

Ajaxified link in MVC3/JQuery not working in IE8 (missing header)

Consider the following code (it is based on a default EMPTY MVC3 project created in 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()</di开发者_StackOverflowv>
</body>
</html>

Index method of 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" } );

The problem is that in IE8 when the myLink link is clicked, it doesn't update the main div with only the partial html from Index.cshtml but the complete html including the layout. Ofcourse it works fine in FF, I mean why shouldn't it right? It seems Request.IsAjaxRequest() always evaluates to false in IE8. I understand that it is a result of a header X-Requested-With not being attached to a request in IE8. I don't have a lot of experience with web development -- is this a common issue and what is the (best) way to solve this?

UPDATE:

Yesterday I got it working normally in IE8, but when I tried it again this morning, the same problem was back. Now I don't think it has anything to do with the settings in IE8 anymore as I restored the settings to the default values. I tried examining the request with the fiddler tool. In order for me to be able to capture the traffic from localhost with fiddler, I added a period to the address: http://localhost.:3157/. So now the error occurs only when I use http://localhost.:3157/ (with period) and it works normally when I use http://localhost:3157/ (without period). I additionally tested the behavior in Chrome, Opera and Safari -- the ajax link works normally in these browsers. Note that I can get it working normally in IE8 when I attach a query parameter to the ajax link like so:

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

I don't really want to do this. I'm running low on ideas here. I'm probably missing something that is blatantly obvious to a seasoned web developer =] Anybody recognize these symptoms?


You probably want to use the .live() method instead of .click():

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

because you are replacing the DOM in the AJAX callback (the #main) which contains the link so you are killing the event handler you have assigned.

Also you have a typo in the jquery script inclusion in the <head>. You are missing a closing > after type="text/javascript":

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

So here's a complete working example:

_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" } )


add

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

to make sure the correct header is attached.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜