2010-11-29 92 views
0

Mise à jour: J'ai complètement supprimé le type de données "html" et j'espère que la valeur de retour sera toujours évaluée - mais rien ne se passe actuellement.Asp.net MVC 2 - L'objet Json retourné n'est pas récupéré en javascript?

J'ai également ajouté le code qui appelle la fonction "openModal". Il se trouve dans le UserControl LogOn contenu dans Site.Master. Espérons que cela éclaircit quelques choses

Il semble que le contrôleur ne retournera pas l'objet JSON à l'appelant ajax, quelque chose est perdu quelque part - je ne suis jamais frappais cette pause point..it entièrement saute

J'ai un modal simple pour les connexions, donc j'appeler l'action LogOn comme ceci:

<div id="logonForm">   
    <% using (Ajax.BeginForm("LogOn", "Account", new AjaxOptions{UpdateTargetId = "logonForm"})) { %> 
      //my login form 
<% } %> 
</div> 

Et l'action se présente comme suit:

 [HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     //success login 
     if (Request.IsAjaxRequest()) 
      return Json(new { Url = Url.Action("Index", "Home") }, JsonRequestBehavior.AllowGet); 
     else 
      return RedirectToAction("Index", "Home");        
    } 

À ce stade, il retursthe nouvel objet JSON avec l'URL du contrôle de l'utilisateur (en Site.master), le javascript ici:

<script type="text/javascript"> 
     function openModel() { 
      $.ajax({ 
       type: "get", 
       url: '/Account/LogOn', 
       contentType: "application/x-www-form-urlencoded;charset=utf-8", 
       // async: true, 
       success: function (result) { 
        debugger; 
        if (typeof result == 'string') { 
         $.modal(result, { 
          closeHTML: "", 
          containerId: "login-container", 
          overlayClose: true 
         }); 
        } 
        else if (result.Url) { 
         debugger; 
         window.location.href = result.Url; 
        } 
       } 
      }); 

     } 

</script> 

<% if (Request.IsAuthenticated) { %> 
     Welcome <b><%: Page.User.Identity.Name %></b>! 
     <%: Html.ActionLink("Log Out", "LogOff", "Account") %>   
<% } else { %> 
     <a href="javascript:openModel()">Log In</a> 
<% } %> 

... mais le javacript les prises ne peuvent pas it..i voir ce qui se trouve dans le "résultat", l'écran affiche un "{Url: /}" - comportement tout simplement étrange

Que manque-t-il? le débogueur; pause est déclenchée lorsque je cliquez d'abord sur le lien, mais lorsque je tente de soumettre le formulaire, il passe à travers le contrôleur LogOn - essaie de renvoyer l'objet JSON, mais ne revient jamais au javascript

Merci beaucoup

+0

D'où vient 'se openModel' appelé à partir? – andynormancx

+0

'dataType:" html ",' cette ligne semble fausse ...ne devrait-il pas être 'dataType:" json ",' –

+0

Ceci est une question de suivi. http://stackoverflow.com/questions/4293765/asp-net-mvc-login-modal-problems-redirect-goes-to-modal/4293904 –

Répondre

0

JQuery ne traitera pas l'appel comme renvoyant json, parce que vous l'avez dit que l'appel est retourné html. Vous devez remplacer votre dataType par json.

Cependant, il n'est pas clair d'où vous vous attendez openModel. Le code tel qu'il est utilisera le code Microsoft AJAX et insérera les données renvoyées dans la page, c'est pourquoi vous voyez votre json apparaître sur la page.

+0

J'ai mis à jour le message original pour inclure d'où il vient - il est appelé par le UserControl qui rend le lien de connexion (dans Site.Master) – Jerrold

0

dataType: "html", devrait être dataType: "json",, et cela devrait résoudre le problème.

+0

Ceci est vraiment un commentaire, pas une réponse à la question. Veuillez utiliser "ajouter un commentaire" pour laisser un commentaire à l'auteur. –

+0

@ OlegV.Volkov En fait, je pense que * est * la réponse. J'ai modifié pour le rendre plus clair. –

-1

Eh bien jQuery ne sera jamais déclencher le rappel success, depuis que vous avez spécifié dataType: "html",, il attendra une réponse text/html, mais vous envoyez JSON. Vous devez utiliser "json" comme type de données.

Voir: http://api.jquery.com/jQuery.ajax/

+0

Il va se déclencher (vous pouvez voir dans la question que cela se produit, il affiche le JSON), il va juste le traiter comme une chaîne, ne jamais analyser le JSON. –

+0

@Nick En effet, manqué cela, un peu plus de mise en forme aurait aidé à dire que clair, semble encore un bug pour moi, échoue silencieusement ici devrait jeter une erreur dans le cas où quelque chose de différent est retourné que demandé:/ –

+0

@Ivo - Pas un bug ... vous le dites "hé quel que soit, le traiter comme html" ... exactement ce que jQuery fait ici :) –

0

Vous devez écraser le soumettre cliquez pour appeler votre fonction personnalisée jQuery ajax. À l'heure actuelle, il utilisera Microsoft ajax. C'est pourquoi votre fonction ajax n'est jamais appelée.

faire quelque chose comme:

$('form').unbind('submit').submit(function(){ 
    $.ajax({ type:'post', url: '/Account/LogOn', data: $(this).serialize(), 
     success: function(){ 
      if (result.Url) 
       window.location.href = result.Url; 
     } 
    }); 
});