2010-11-10 3 views
1

J'ai une application qui ne charge qu'une vue complète une fois. Ma raison de le faire n'est pas importante. Ce qui est important, c'est que le reste du contenu ne revienne que dans des vues partielles. En plus de certains contenus, j'ai quelques objets JSON que je voudrais passer en arrière et vers le serveur avec chaque requête AJAX.Renvoyer une vue dans le cadre d'un objet JSON

Existe-t-il un moyen de renvoyer un objet JSON avec une vue comme l'une de ses propriétés? Cela serait extrêmement utile et économiserait sur la bande passante car ma solution actuelle consiste à faire deux appels ajax, un pour le JSON et un pour la vue partielle qui prend non seulement plus de temps et plus de bande passante, mais aussi deux méthodes d'action séparées. quelques trucs de fantaisie sur le côté serveur. Sérialiser une vue dans un objet JSON résoudrait tous mes problèmes.

Quel est le meilleur moyen d'y parvenir et quels inconvénients (le cas échéant) y aurait-il à le faire?

Répondre

1

Voici un morceau intéressant de code qui semble faire ce que je veux et préserve modèle de liaison de ce que je peux dire.

protected string RenderPartialViewToString(string viewName, object model) 
{ 
    controller.ViewData.Model = model; 

    using (StringWriter sw = new StringWriter()) 
    { 
      ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); 
      ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
      viewResult.View.Render(viewContext, sw); 

      return sw.GetStringBuilder().ToString(); 
    } 
} 

Fonctionne comme un charme. Je l'utilise simplement et passe la chaîne en tant que paramètre JSON, puis sur le client, je lis le paramètre et le dépose dans son conteneur approprié. Je suis très excité d'avoir ce travail.

3

Vous pouvez afficher la vue depuis le contrôleur et la renvoyer au client avec l'objet JSON.

Si vous utilisez mon helper to render ActionResult to a string simple, alors votre code ressemblera:

public JsonResult DoSomething() { 
    var viewString = View().Capture(ControllerContext); 
    return new JsonResult { 
     JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
     Data = new { 
      time = DateTime.Now, 
      html = viewString 
     } 
    }; 
} 
+0

Je pense que peut-être vous vous méprenez. Je veux inclure une vue partielle asp.net MVC à l'intérieur d'une méthode d'action qui retourne JsonResult. Vous ne pouvez pas simplement placer un ViewResult dans un JsonResult autant que je sache. Comment transformer la vue en une chaîne et l'amadouer sur le jsonresult? – Chev

+0

J'ai mis à jour la réponse. Il devrait fonctionner pour vous. J'apprécierais que vous puissiez évaluer/partager mon blog comme je l'ai fait pour répondre spécifiquement à cette question :) –

+0

View() ne semble pas avoir une méthode appelée Capture. J'ai trouvé ce dont j'avais besoin et je l'ai posté comme réponse à ma propre question. Merci pour l'aide. – Chev

Questions connexes