L’appel JSON de MVC 3 ne fonctionne pas dans IIS

Je travaille dans une application MVC 3 avec un moteur ASPX et, comme sharepoint départ, j’ai développé une recherche simple qui utilise un appel JQuery JSON pour récupérer des informations. L’appel envoie un paramètre pris à partir d’une entrée de texte et met à jour un tableau avec les résultats. Le funcion ressemble à ceci:

function PerformLookup() { var _accountNumber = $('#accountNumber').val(); $.ajax({ url: '/SearchAjax/SearchAccount', type: 'POST', data: '{_accountNumber:'+_accountNumber+'}', dataType: 'json', contentType: 'application/json; charset=utf-8', success: function (data) { UpdateTable(data); }, error: function () { alert('An error occurred while performing the search.'); } }); return false; } 

Le code serveur exécute une requête avec ce paramètre et renvoie une liste sérialisée au format JSON à utiliser normalement avec JQuery. Le code du serveur ressemble à ceci:

  [HttpPost] public JsonResult SearchAccount(ssortingng _accountNumber) { MLIBEntities dbMLIB = new MLIBEntities(); var searchResults = (from s in dbMLIB.Sets where s.setmap1 == _accountNumber select s); return Json(searchResults.ToList()); } 

Comme vous le voyez, rien de difficile et cela fonctionne parfaitement lorsque je lance le projet à partir de VS2010 et utilise sa machine virtuelle.

Le problème se produit lorsque je publie le projet sur un serveur Windows 2008 avec IIS 7. Le projet s’exécute normalement mais lorsque j’exécute la fonction PerformLookup, le message “Une erreur s’est produite lors de la recherche” signifie que l’appel ajax a échoué.

Quelqu’un at-il une idée de la raison pour laquelle l’appel échoue dans IIS alors qu’il fonctionne parfaitement dans la machine virtuelle VS2010? Est-ce que je manque toute configuration IIS sage?

Merci d’avance!

Ne jamais coder en dur des URL de ce type, car lorsque vous déployez votre application, un répertoire virtuel peut être ajouté à vos URL:

 url: '/SearchAjax/SearchAccount', 

Utilisez toujours des aides URL lorsque vous traitez avec des URL:

 url: '<%= Url.Action("SearchAccount", "SearchAjax") %>', 

Alors voici comment je refactoriser votre code:

 function PerformLookup() { var _accountNumber = $('#accountNumber').val(); $.ajax({ url: '<%= Url.Action("SearchAccount", "SearchAjax") %>', type: 'POST', data: JSON.ssortingngify({ _accountNumber: _accountNumber }), dataType: 'json', contentType: 'application/json; charset=utf-8', success: function (data) { UpdateTable(data); }, error: function () { alert('An error occurred while performing the search.'); } }); return false; } 

ou si cette fonction PerformLookup est appelée quand un lien est cliqué, le lien serait généré avec un assistant HTML:

 <%= Html.ActionLink( "Perform search", "SearchAccount", "SearchAjax", null, new { id = "search" } ) %> 

et ensuite simplement AJAXify it:

 $(function() { $('#search').click(function() { var _accountNumber = $('#accountNumber').val(); $.ajax({ url: this.href, type: 'POST', // Probably no need to send JSON request // so I've replaced it with a standard // application/x-www-form-urlencoded POST request data: { _accountNumber: _accountNumber }, dataType: 'json', success: function (data) { UpdateTable(data); }, error: function () { alert('An error occurred while performing the search.'); } }); return false; }); }); 

Enfin, je vous recommande vivement d’utiliser FireBug, un excellent outil vous permettant de résoudre ce type de problèmes car il affiche toutes les demandes AJAX et ce qui se passe entre le client et le serveur.

il suffit de mettre l’URL complète en javascript:

 $.ajax({ type: "POST", url: "/Appnamehere/Controller/Action", ... 

cela fonctionne bien ..