Question

Permettez-moi tout d'abord mis les extraits de code ici. Je suis juste en utilisant le projet ASP.NET MVC Visual Studio crée de la boîte. Donc, je suis en train de mettre les extraits j'y ajoutais:

section de tête de 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>  

Contenu de test.js:

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

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

Procédé HomeController:

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

Maintenant, le problème que je vois dans Firefox 3.5.30729 (Firebug) est lorsque la demande ajax sort, IIS 7 sur la boîte à distance envoie Http 302 dos, ce qui fait la redirection et force une autre requête get, mais ce n'est pas asynchrone. Opera ne aussi je suppose fonctionne pas il est donc le même problème. Cependant, le code ci-dessus fonctionne très bien dans IE 8, Chrome et Safari.

localhost tous les navigateurs ci-dessus fonctionnent comme prévu, y compris Firefox et Opera - ils reçoivent tous « Got demande ajax! » en tant que réponse du serveur.

Quelqu'un a des idées ce qui se passe ici et comment y remédier? Je cherche une vraie solution ou au moins des explications à ce qui se passe et pourquoi.

Était-ce utile?

La solution

Alors jouer avec Fiddler a fait figure d'aide sur cette question. Voici ce qui se passait:

L'URI appel .get $ ont été à l'origine pour ne pas trouver la méthode d'action, je l'ai indiqué dans ma question que le serveur était de retour d'une 302. Une fois que Firefox (et Opera) a obtenu 302 du serveur, ils ont tous deux essayé en utilisant "/ home / TestAjax /" (avec une barre oblique à la fin). Cependant, cette fois-ci l'en-tête HTTP n'a pas X-demande-Avec réglé sur « XMLHttpRequest ». Ainsi, dans la méthode d'action TestAjax() Request.IsAjaxRequest() était fausse, d'où je suis arrivé « demande non-ajax » retour comme réponse.

D'autre part, la raison pour laquelle IE, Safari et Chrome travaillaient parce qu'ils avaient encore X-Demande-Avec réglé sur « XMLHttpRequest » à la demande redirigée. Il est encore un mystère pour moi de savoir pourquoi Firefox et Opera n'a pas, mais je ne vais pas à se soucier à ce stade.

Tout à fait stupide de ma part d'oublier la barre oblique de fin, mais je ne savais pas qu'il a tenu une telle importance!

Autres conseils

La conception acceptée des méthodes d'action est de retour ActionResult . Dans votre cas, vous retournez une chaîne. Essayez ceci:

public ActionResult TestAjax()
{
    if (Request.IsAjaxRequest())
    {
        return Content("Got ajax request!", "text/plain");
    }
    return View();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top