2010-08-17 5 views
7

J'utilise le plugin de calendrier complet Jquery, et je veux être en mesure de cliquer sur un événement et les détails de l'événement à remplir via AJAX dans une div avec l'ID de #details.jQuery.Load() ne déclenche pas Request.IsAjaxRequest dans ASP.NET MVC2

Voici l'action de mon contrôleur que j'essaie de charger. Lors du débogage, l'action ne considère pas que la requête entrante est AJAX et renvoie la vue complète à la place du partiel. Est-ce important si la vue complète est appelée la même que la vue partielle? C'est à dire; 'Details.aspx' & 'Détails.ascx'?

public ActionResult Details(int id) 
    { 
     Pol_Event pol_Event = eventRepo.GetEvent(id); 
     ViewData["EventTypes"] = et.GetEventType(id); 
     if (pol_Event == null) 
      return View("NotFound"); 
     else 
     { 
      if(HttpContext.Request.IsAjaxRequest()){ 
       return PartialView("Details"); 
      } 
      else 
       return View(pol_Event); 

     } 
    } 

Voici le code jquery que j'utilise. Ai-je manqué de ne pas utiliser .load() correctement dans la fonction eventClick? Le développeur du plugin de calendrier a confirmé que eventClick n'a rien à voir avec AJAX, donc la faute doit résider dans mon code.

$(document).ready(function() { 
      $('#calendar').fullCalendar({ 

       header: { 
        left: 'prev,next today', 
        center: 'title', 
        right: 'month,agendaWeek,agendaDay' 
       }, 

       events: "/Events/CalendarData", 
       allDayDefault: false, 

       selectable: true, 
       eventClick: function(event) { 
        $('details').load(event.url); 
       }, 
       eventRender: function(event, element) { 
        element.qtip({ 
         content: event.title + " @ " + event.venue, 

         position: { 
          corner: { 
           target: 'topLeft', 
           tooltip: 'bottomLeft' 
          } 
         } 

        }); 
       } 


      }); 

     }); 

Alors que j'utilise la fonction Jquery.Load() de manière incorrecte, ou est-il quelque chose de mal avec mon contrôleur?

Plus de mises à jour: J'ai finalement attrapé le problème. La XMLHttpRequest est en cours d'envoi, mais je rencontre une erreur de serveur interne de 500, pas encore résolue car je n'arrive pas à comprendre ce qui cause l'erreur.

Host: localhost:4296 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 
Firefox/3.6.8 
Accept: text/html, */* 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
X-Requested-With: XMLHttpRequest 
Referer: http://localhost:4296/Events/EventCalendar 
Cookie: .ASPXAUTH=56C5F4FD536564FF684F3F00E9FB51A5F2F1B22D566C517923D71FEAF599D266531CAC52BF49D2700E048DD420A4575456855303CC2DCB5875D4E1AD8883821EA62E5169969503776C78EB3685DAA48C 

MISE À JOUR: J'ai finalement compris quel était le problème. Je ne passait pas dans le modèle de la partie de sorte que la ligne

return PartialView("Details"); 

aurait dû être

return PartialView("Details", pol_Event); 

ce générait 500 erreur de service interne.

+0

comment Résume IsAjaxRequest() fonctionne: http://bit.ly/bXq32v – BritishDeveloper

Répondre

5

Lorsque vous effectuez une requête Ajax vous êtes supposé définir la « X-requested-Avec » en-tête HTTP à quelque chose comme « XMLHttpRequest » par exemple.

Host    www.google.com 
User-Agent   Mozilla/5.0 (Windows; U; Windows NT 6.1; (snip...) 
Accept    */* 
Accept-Language  en-us,en;q=0.5 
Accept-Encoding  gzip,deflate 
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive   115 
Connection   keep-alive 
X-Requested-With XMLHttpRequest 
Referer    http://www.google.com 

Cet en-tête 'X-Requested-With' est ce que la méthode 'IsAjaxRequest() cherche. Normalement, les méthodes Ajax de jQuery enverront automatiquement cet en-tête. Je suppose que pour une raison quelconque, le plugin jQuery Calendar n'envoie pas cet en-tête.

Je voudrais télécharger quelque chose comme fiddler, ou installer Firebug for Firefox et vérifier les données HTTP Request/Response brutes lorsque le contrôle Ajax request/Calendar est déclenché/initialisé. Vérifiez si l'en-tête X-Requested-With est inclus.

+0

Un grand merci, je ll ping le développeur du plugin un mail – MrBliz

3

Oui. Bien qu'il ne doit pas être envoyé en tant qu'en-tête de demande HTTP. Vous pouvez le POST dans une donnée de formulaire ou dans la chaîne de requête d'un GET. www.example.com?x-requested-with=XMLHttpRequest (valeur sensible à la casse)

Semble ridicule mais vrai. Je l'ai essayé et il fonctionne :) La réflexion sur la méthode d'extension IsAjaxRequest() prouvera ceci:

return ((request["X-Requested-With"] == "XMLHttpRequest") || ((request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest"))); 
+0

Un grand merci pour votre réponse, et un aperçu supplémentaire – MrBliz

Questions connexes