2009-06-24 7 views
2

Voici mon appel ajax:

response = $.ajax({ 
      type: "POST", 
      url: "/Row/getRowName", 
      dataType: "json", 
      data:({ currRow : rowName, offset : 5 }), 
      error:function(request){alert(request.statusText)}, 
      success:function(result){alert(result)} 
     }).responseText; 

J'obtiens l'erreur interne du serveur comme une alerte. J'ai également un point d'arrêt défini dans ma méthode getRowName dans mon RowController.

Voici la méthode getRowName:

[AcceptVerbs(HttpVerbs.Post)] 
    public string getRowName(string currRow, int offset) 
    { 
     string rowName; 

     rowName = _rowRepository.getRowNameByOffset(currRow, offset); 

     return rowName; 
    } 

Quelles sont les causes d'une erreur interne du serveur? Comment puis-je le réparer? Est-ce que j'utilise correctement le concept de contrôleur entier ou devrais-je utiliser WebServices pour des choses comme ça?

Édition: Le contrôleur qui appelle la page est HomeController où l'appel que je fais est à RowController. RowController est dans le même dossier que HomeController (pas sûr si cela compte).

Mais je trouve si je crée une fonction simulée:

[AcceptVerbs(HttpVerbs.Post)] 
    public string sayHi() 
    { 
     return "Hi"; 
    } 

et de l'appeler de la même façon (URL différente, car il est dans le contrôleur de la maison):

response = $.ajax({ 
      type: "POST", 
      url: "/Home/sayHi", 
      dataType: "json", 
      error:function(request){alert(request.statusText)}, 
      success:function(result){alert(result)} 
     }).responseText; 

Toutes les idées pourquoi cela fonctionnerait et l'autre ne le ferait pas?

+0

La fonction getRow côté serveur est-elle atteinte lorsque vous passez un appel? – shahkalpesh

Répondre

0

Votre serveur doit être résilient. Rien JQuery ou aucun client ne devrait être capable de provoquer une erreur HTTP 500. Quant au serveur, le code que vous avez donné n'explique rien. Il se résume à:

return _rowRepository.getRowNameByOffset(currRow, offset) 

Nous aurions probablement besoin d'au moins la source de getRowNameByOffset pour commencer à figurer dehors.

EDIT: Un autre pense que vous pouvez essayer pour le test est juste d'avoir quelque chose de trivial getRowName revenir comme:

return "currRow" + " " + offset 

pour vérifier que le problème est pas ailleurs.

+0

Je viens de l'essayer et cela n'a pas fonctionné, toujours obtenir l'erreur interne du serveur ... – Matt

+0

Je suis nouveau à MVC, donc j'ai peut-être manqué quelque chose d'évident ... Je ne pense pas si – Matt

+0

Euh ... Si votre application MVC renvoie une exception non gérée, il s'agit d'une réponse automatique 500. – womp

0

Je pense que votre problème pourrait être les parenthèses autour des données. Il devrait vraiment être juste un objet qui est utilisé pour les arguments. Si j'ai raison, l'erreur interne du serveur est due au fait que le gestionnaire d'itinéraire ne trouve pas de signature appropriée pour getRowName. Pour que cela fonctionne, vous devez également renvoyer un JsonResult à partir de votre méthode, pas une chaîne. Cela peut également être le problème car il peut uniquement rechercher des méthodes qui retournent un objet ActionResult.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult getRowName(string currRow, int offset) 
{ 
    string rowName; 

    rowName = _rowRepository.getRowNameByOffset(currRow, offset); 

    return Json(new { RowName = rowName }); 
} 

De même, l'appel Ajax n'aboutira pas à un objet. Vous devez avoir votre gestionnaire de succès faire tout ce que vous essayez de faire avec la réponse.

$.ajax({ 
     type: "POST", 
     url: "/Row/getRowName", 
     dataType: "json", 
     data: { currRow : rowName, offset : 5 }, 
     error:function(request){alert(request.statusText)}, 
     success:function(result){ 
      $('#rowNameContainer').html(result.RowName); 
     } 
}); 

Si vous avez vraiment besoin du résultat dans une variable (peu probable, mais possible), vous pouvez exécuter l'appel ajax synchroniquement (async: false) et définir une variable dans la fonction de réussite.

$(...).click(function() { 
    var response = null; 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "/Row/getRowName", 
     dataType: "json", 
     data: { currRow : rowName, offset : 5 }, 
     error:function(request){alert(request.statusText)}, 
     success:function(result){ 
      response = result.RowName; 
     } 
    }); 

    ... do something with response... 
    return false; 
}); 
+0

Les parenthèses ne sont pas le problème. ({currRow: rowName, offset: 5}) et {currRow: rowName, offset: 5} évaluent la même chose ici (un objet avec 2 clés). Essayez-le. Cependant, vous avez raison sur le fait que .ajax soit asynchrone. –

3

Exécutez-vous IE8 ou Firefox avec FireBug installé? L'utilisation des consoles de script dans les deux vous donnera beaucoup plus d'informations sur les détails de l'erreur que vous obtenez du serveur. Les différences entre les deux méthodes que vous postez sont les paramètres - la deuxième méthode dans votre édition n'en a pas, tandis que celle de la première méthode en a - je parie que l'erreur 'voir est à voir avec le cadre ne désérialisant pas vos données correctement.

Dans le premier cas, avez-vous essayé:

data:"{ \"currRow\":\"" + rowName + "\", \"offset\":\"5\" }" 
0

j'ai eu une erreur 500 parce que je n'ai pas ajouté explicitement ceci:

type: "POST", 

Une fois que j'ajouté que, tout allait bien. Je n'ai pas marqué explicitement la méthode Action comme GET ou POST, donc je suppose que par défaut c'est POST - d'où l'erreur.

Questions connexes