Détection de IsAjaxRequest () avec ASP.NET MVC et le plug-in de formulaire JQuery / le téléchargement de fichier

J’utilise le plugin JQuery Form pour effectuer un téléchargement de fichier sur une application ASP.NET MVC. J’ai appris que depuis qu’un iframe est utilisé pour les téléchargements de fichiers (plutôt que XMLHttpRequest, ce qui n’est pas possible), la vérification côté serveur pour IsAjaxRequest échoue.

J’ai lu quelques articles sur cette question, mais je n’ai trouvé aucune bonne solution pour contourner ce problème. Comme pour le rest de mon application, j’aimerais pouvoir prendre en charge les scénarios activés pour JavaScript et ceux désactivés pour JavaScript, raison pour laquelle j’aimerais détecter si une demande est ajax ou non.

Je réalise que l’approche iframe utilisée n’est pas techniquement ajax, mais j’essaie d’imiter un effet ajax.

Toute suggestion serait la bienvenue.

Je viens de me rendre compte que je n’avais absolument pas répondu à la question, je rajoute donc le haut de la page et laisse l’ancienne réponse ci-dessous:

Le problème est que lors de la publication d’un fichier sur un iFrame, l’en-tête “X-Requested-With” n’est pas définie et vous ne pouvez pas définir d’en-têtes de demande spécifiques pour une forme normale POST en Javascript. Vous devrez recourir à d’autres astuces, telles que l’envoi d’un champ masqué avec votre POST contenant une valeur, puis modifier ou remplacer la méthode d’extension “IsAjaxRequest” pour vérifier également cette condition. Comment remplacer une méthode d’extension existante?

La meilleure option serait probablement d’inclure votre propre méthode d’extension avec un nom différent, basé sur le code de méthode d’extension MVC par défaut avec les modifications permettant de détecter votre POST de téléchargement iFrame, puis d’utiliser votre méthode d’extension partout où vous en auriez besoin.


En fait, jQuery définit l’en-tête ‘X-Requested-With’ sur ‘XMLHttpRequest’ par défaut. C’est très utile tant que vous prenez soin de faire tous vos appels AJAX sur jQuery.

En fonction de vos besoins, il est facile de configurer la détection dans un filtre d’action pour l’utiliser où vous le souhaitez, ou même de la construire dans une classe de contrôleur de la manière suivante:

[jQueryPartial] public abstract class MyController : Controller { public bool IsAjaxRequest { get; set; } } 

Le ActionFilterAtsortingbute:

 public class jQueryPartial : ActionFilterAtsortingbute { public override void OnActionExecuting(ActionExecutingContext filterContext) { // Verify if a XMLHttpRequest is fired. // This can be done by checking the X-Requested-With // HTTP header. MyController myController = filterContext.Controller as MyController; if (myController != null) { if (filterContext.HttpContext.Request.Headers["X-Requested-With"] != null && filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") { myController.IsAjaxRequest = true; } else { myController.IsAjaxRequest = false; } } } } 

Et en utilisant la mise en œuvre:

 public class SomeController : MyController { public ActionResult Index() { if (IsAjaxRequest) DoThis(); else DoThat(); return View(); } } 

Vous devez définir l’en-tête “X-Requested-With” pour que la méthode IsAjaxRequest renvoie true. Voici comment vous le faites dans jQuery.

 $(document).ready(function() { jQuery.ajaxSetup({ beforeSend: function (xhr) { xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); return xhr; } }); }); 

A partir de ASP.NET MVC 2 (et des versions ultérieures), il existe une méthode d’extension sur la Request .

 if (Request.IsAjaxRequest()) { // was an ajax request } 

Si vous utilisez une méthode jQuery telle que .load () sur une méthode de contrôleur, Request.IsAjaxRequest() renvoie true.

Je suis tombé par hasard sur cette question et, plus tard, j’ai trouvé une meilleure solution. La voici (pour tout le monde qui arrive ici depuis Google):

Le plugin de formulaire jQuery a deux options qui pourraient aider dans ce cas.

  1. si vous utilisez post request, il semble que vous utilisiez toujours l’iframe. Par conséquent, si vous n’avez pas besoin de télécharger des fichiers, la définition de iframe = false dans les options de formulaire m’a aidé dans mon cas.

  2. Si vous avez besoin d’iframe pour fileuploads, vous pouvez utiliser la propriété data des options pour tromper les

    IsAjaxRequest() setting : data: { "X-Requested-With": "XMLHttpRequest" }

Le script complet avec les deux options ressemble à ceci:

 $('#someform').ajaxForm( { dataType: 'json', success: onSuccess, error: onError, iframe: false data: { "X-Requested-With": "XMLHttpRequest" } } );