2009-04-06 6 views
1

Je construis juste ma première application MVC et je rencontre un problème en essayant d'effectuer une recherche en utilisant AJAX/JSON. Le problème semble être que le JSON renvoyé par mon contrôleur n'est pas un tableau signifiant que je ne peux pas utiliser la méthode $ .each de jQuery pour itérer sur mes éléments. J'essaie de rechercher un utilisateur par adresse e-mail.Méthode Json() du contrôleur ne retournant pas de tableau

J'ai une classe SearchController avec la méthode suivante:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult SearchByEmail(string searchString) 
{ 
    var users = new List<jsonUser>(); 
    foreach (I_User u in _rep.SearchByEmail(searchString)) 
    { 
    users.Add(new jsonUser() 
    { 
     EmailAddress = u.EmailAddress, 
     FirstName = u.Firstname, 
     LastName = u.Surname, 
     UserName = u.Username 
    }); 
    } 
    return Json(users); 
} 

qui tire correctement et renvoie quelque chose qui semble, à moi de toute façon, comme un tableau JSON:

[{"EmailAddress":"[email protected]","UserName":"[email protected]","FirstName":"Foo","LastName":"Bar"}] 

Et puis dans ma page, j'ai le code suivant:

$("#search").click(function(evt) { 
    var emailsearch = jQuery.trim($("#email").val()); 
    $.post("/Search/SearchByEmail", { searchString: emailsearch }, 
     function(Users) { 
      $("#jsonlist").text(Users); //Added to check what JSON returns. 
      alert($.isArray(Users)); //Added to work out if jQuery thinks this is an array! 
      $.each(Users, function() { 
       //Do stuff on each user item 
      }); 
     }); 
    }); 
}); 

En ajoutant les lignes commentées ci-dessus, jev Nous avons établi que cette fonction obtenait un résultat raisonnable (le JSON posté ci-dessus) mais qu'elle ne pense pas que ce soit un tableau. En tant que tel, $ (this) dans la boucle $ .each n'est pas défini.

J'ai emprunté de gros morceaux à l'application NerdDinner, et je ne vois vraiment pas quelle est la différence. Toutes les suggestions grandement appréciées!

Répondre

3

Si vous renvoyez JSON avez-vous essayé d'ajouter le paramètre de type de données approprié aux arguments de votre appel $ .post?

$.post("/Search/SearchByEmail", 
     { searchString: emailsearch }, callback, "json"); 

Le message sera généralement par défaut ou Html texte afin de ne pas faire le nécessaire pour eval « désérialiser » le corps de poste.

+0

Cela a fait l'affaire - m'a donné un mal de tête en travaillant, depuis mon appel de debug $ ("# jsonlist"). Text (Users); commencé à échouer une fois Les utilisateurs étaient un objet plutôt qu'une chaîne! –

1

Je pense que vous aurez besoin d'eval() la réponse pour l'obtenir correcte. Essayez quelque chose comme:

$("#search").click(function(evt) { 
    var emailsearch = jQuery.trim($("#email").val()); 
    $.post("/Search/SearchByEmail", { searchString: emailsearch }, 
     function(data) { 
      $("#jsonlist").text(data); //Added to check what JSON returns. 
      Users = eval('(' + data + ')'); 
      alert($.isArray(Users)); //Added to work out if jQuery thinks this is an array! 
      $.each(Users, function() { 
       //Do stuff on each user item 
      }); 
     }); 
    }); 
}); 
+0

Cela ne semble pas aider - aucune idée pourquoi cela devrait être le cas? Je pensais que eval() vient d'être exécuté quel que soit l'argument passé - est-ce que JSON est exécutable? –

+0

eval() analysera une chaîne correctement formatée en un littéral d'objet json –

Questions connexes