2013-03-23 21 views
7

Così ho un metodo finito che funziona e lo uso in tutto il sito:ASP.NET MVC render vista parziale ad una stringa di tornare con JSON

public PartialViewResult GetBlogEntries(int itemsToTake = 5) 
{ 
    ... 
    return PartialView("_BlogPost", model); 
} 

Ora voglio ottenere questo dal mio javascript in forma JSON.

public JsonResult GetBlogPostJson() 
{  
    var blogEntry = GetBlogEntries(1); 
    var lastEntryId = GetLastBlogEntryId(); 
    return Json(new {Html = blogEntry, LastEntryId = lastEntryId}, JsonRequestBehavior.AllowGet); 
} 

idea è di ottenere in questo modo:

$.ajax({ 
      url: '/Blog/GetBlogPostJson', 
      dataType: 'json', 
      success: function (data) { 
       var lastEntryId = data.LastEntryId; 
       var html = data.Html; 
       ... 
      } 
     }); 

problema è che questo, naturalmente, non producono una stringa, ma un PartialViewResult.

La domanda è: come posso risolvere PartialViewResult in html che posso inviare indietro con JSON?

+0

Per favore correggimi se sbaglio, vuoi generare HTML, quindi ottenere un ID da questo HTML e infine inviare sia Id che HTML in JSON? – Dima

+0

Sì e no. Il metodo GetBlogEntries() crea una vista parziale che chiamo da vari punti della pagina web. Tuttavia, non stampa l'ID ovunque. Quindi ho bisogno di farlo separatamente. Quindi invia l'html e l'id al chiamante. Il javascript sul client farà in modo di ottenere solo nuovi post di blog se ce ne sono di nuovi da ottenere. – Patrick

+0

@NickLarsen, per favore guarda di nuovo la domanda e rispondi contrassegnandola come duplicata. Questa domanda richiede un modo per visualizzare Visualizza come JSON (come da un punto finale), mentre altri richiedono il rendering di un Rasoio. Simile, sì. Ma sicuramente non è lo stesso caso d'uso. –

risposta

16

L'ho esaminato circa 6 mesi fa. L'obiettivo era usare un partial per popolare una finestra di dialogo jquery.

Il problema è la View Engine vuole renderli in un suo ordine imbarazzante ...

Prova questa. LMK se ha bisogno di chiarimenti.

public static string RenderPartialViewToString(Controller thisController, string viewName, object model) 
    { 
     // assign the model of the controller from which this method was called to the instance of the passed controller (a new instance, by the way) 
     thisController.ViewData.Model = model; 

     // initialize a string builder 
     using (StringWriter sw = new StringWriter()) 
     { 
      // find and load the view or partial view, pass it through the controller factory 
      ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(thisController.ControllerContext, viewName); 
      ViewContext viewContext = new ViewContext(thisController.ControllerContext, viewResult.View, thisController.ViewData, thisController.TempData, sw); 

      // render it 
      viewResult.View.Render(viewContext, sw); 

      //return the razorized view/partial-view as a string 
      return sw.ToString(); 
     } 
    } 
+0

Ha funzionato come un fascino. Grazie =) – Patrick

+0

come faccio a passare (Controller thisController), puoi mostrarmi come userò il tuo metodo? –

+0

Funziona ma non è unità testabile. :( –

Problemi correlati