2009-02-11 6 views
2

J'ai une page qui dépend fortement d'un IList (dans ActionResult "MyEvents") que je passe dans ViewData. Quelque chose comme ça: ViewData ["events"] = listOfEvents; et à la fin, je juste return View();Comment puis-je mettre à jour un ASP.NET MVC ViewData via jQuery ajax?

Et dans ma vue, je prends ce ViewData ["events"] et fais un foreach pour que je puisse parcourir son contenu. Mais, ce ViewData doit être rempli dynamiquement. Donc, quand je clique sur un jour (j'utilise jQuery DatePicker), ce jour est envoyé comme argument à "MyEvents" et ce jour sera très important pour mes listOfEvents qui rempliront mes ViewData ["events"]. Mais le résultat que je reçois est que la div qui contient mon foreach crée une autre page entière à l'intérieur !! J'ai essayé de faire $ ("# myDiv"). Html (contentFromMyEvents) et c'est ce qui s'est passé.

Juste pour le test, je l'ai essayé aussi de faire $ (« # myDiv »). (Texte contentFromMyEvents) et tout le code html avec toutes ses étiquettes et everyting autre de ma page est apparu dans la div! C'était une page à l'intérieur d'une page !!

Donc, je pense que cela se passe parce que je suis de retour "return View();" et bien sûr, il rendra toute ma vue à nouveau. Alors, comment puis-je passer juste le ViewData ["events"] et le mettre à jour sur ma page ???

Merci!

Répondre

3

Regardez la fonction de charge dans jQuery (http://docs.jquery.com/Ajax/load). Appelez votre contrôleur avec la charge, puis injectez le résultat dans votre document html.

$("myDiv").load("/Controller/Action"); 

Votre ViewData sera analysé côté serveur. Au lieu de renvoyer View(), renvoyez un PartialView() pointant vers un contrôle utilisateur. Ce qui sort le est juste un fragment de HTML.

+0

Cette façon fonctionnera mais je pense personnellement que c'est une mauvaise pratique d'envoyer du code HTML sur le tuyau. – Kelly

+0

D'accord. Je pense qu'il y a peut-être des circonstances dans lesquelles mon exemple est acceptable. Je viens de le fournir pour l'exhaustivité. –

+0

En y réfléchissant un peu plus, j'ai utilisé cette technique récemment quand j'avais besoin d'intégrer un formulaire d'entrée existant dans un autre formulaire. La mise en page de formulaire était déjà dans une autre vue, et j'avais juste besoin d'un modal avec cette même interface graphique pour une fonctionnalité "ajout rapide". –

1

Vous pouvez utiliser un rendu partiel ou vous pouvez avoir jquery sélectionner l'élément à partir de la valeur de retour.

$("#myDiv").empty().append($(contentFromMyEvents).find('#myDiv')); 

De plus, gardez à l'esprit que si vous avez des datepickers ou des liens qui nécessitent des événements à l'intérieur de là, vous pourriez avoir à les lier de nouveau.

1

Vous devriez regarder dans le transfert de données en avant et en arrière comme JSON. Ensuite, en utilisant jQuery/Javascript pour manipuler et formater les données comme bon vous semble. N'oubliez pas qu'une fois que la page est sur le client, le navigateur du client n'a aucune idée de ce que ViewData est.

Edit: Code d'action:

public ActionResult AjaxGetEvents(int id) 
{ 
    IList<object> events = new List<object>(); 
    foreach(Event event in SomeMethodToGetEvents(id)) 
    { 
     events.Add(new { Property1 = event.Property1, Property2 = event.Property2 }); 
    } 
    return JSON(events); 
} 

client Code Side:

var url = "some url that returns JSON"; 
jQuery.getJSON(url, function(data){ 
    jQuery.each(data){ 
     jQuery("#someDiv").append(data.Property1 + " " + data.Property2 "<br/>"); 
    }); 
});  
+0

Kelly, je fais quand je ckick un jour: .ajax $ ({ url:? Administrateur/Calendrier/MyEvents/data = '+ date, le type : 'GET', succès: function (content) {$ ("# myDiv"). html (contenu) )}; C'est quelque chose comme ça. Le problème est que "return View();" (dans mon ActionResult) est (continue ...) – AndreMiranda

+0

(continue ...) retourne toute ma page à cette option "succès" $ .ajax. Je pense que je dois retourner tout autre type de données dans mon ActionResult ... Je ne sais pas, peut-être "retourner JSON (ViewData [" events "]);" ??? – AndreMiranda

+0

Dans ma page je suis en train de faire ceci: foreach (Evénement UserEvents dans (IEnumerable) ViewData ["events"]) {// faire toute itération ici} ... Alors, comment puis-je obtenir un JSON et traiter cette ViewData ??? – AndreMiranda

Questions connexes