2010-09-12 8 views
5

Dans MVC 2 avec le moteur régulier de vue que je pourrais retourner une vue partielle ascx sous forme de chaîne par return Json()Retour Razor vue partielle en utilisant JSON (ASP MVC 3)

Mais avec les nouvelles vues .cshtml rasoir, je ne peux pas comprendre comment faire ça Je reçois toujours Type 'ASP.CustomerForm_cshtml' does not inherit from 'System.Web.UI.UserControl'.

La vue partielle hérite de System.Web.Mvc.WebViewPage<T> et une autre erreur apparaît si j'hérite de System.Web.UI.UserControl<T> comme l'indique la première erreur.

Des idées sur la façon de résoudre ce problème en utilisant ASP MVC 3 et le moteur de vue Razor?

Ceci est ma fonction ControlToString:

private string ControlToString(string controlPath, object model) 
    { 
     ViewPage page = new ViewPage(); 
     ViewUserControl ctl = (ViewUserControl)page.LoadControl(controlPath); 
     page.Controls.Add(ctl); 
     page.ViewData.Model = model; 
     page.ViewContext = new ViewContext(); 
     System.IO.StringWriter writer = new System.IO.StringWriter(); 
     System.Web.HttpContext.Current.Server.Execute(page, writer, false); 
     string outputToReturn = writer.ToString(); 
     writer.Close(); 
     //return this.Json(outputToReturn.Trim()); 
     return outputToReturn.Trim(); 
    } 

Répondre

6

Ce pourrait vous aide comme je l'ai écrit sur le dessus de ma tête sans le tester autre que de valider renvoie le fichier cshtml rendu. J'ai supposé que c'était une méthode dans un contrôleur.

private string ControlToString(string controlPath, object model) { 
    CshtmlView control = new CshtmlView(controlPath); 

    HtmlTextWriter writer = new HtmlTextWriter(new System.IO.StringWriter()); 
    control.Render(new ViewContext(this.ControllerContext, control, this.ViewData, this.TempData, writer), writer); 

    string value = ((StringWriter)writer.InnerWriter).ToString(); 

    return value; 
} 
+0

Merci, cela fonctionne. Je reçois la vue comme une chaîne. Mais le modèle n'est pas pris en charge partout dans votre code. J'ai essayé d'ajouter le modèle en tant que paramètre dans 'CshtmlView()' mais il n'a pas pris model comme paramètre. Des pensées? – Martin

+0

je l'ai élaboré, vous devez ajouter 'this.ViewData.Model = model;' dans votre code, alors cela fonctionne: D – Martin

5

C'est le MVC 3 version bêta du code:

private string ControlToString(string controlPath, object model) 
    { 
     //CshtmlView control = new CshtmlView(controlPath); 
     RazorView control = new RazorView(this.ControllerContext, controlPath, null, false, null); 

     this.ViewData.Model = model; 

     HtmlTextWriter writer = new HtmlTextWriter(new System.IO.StringWriter()); 
     control.Render(new ViewContext(this.ControllerContext, control, this.ViewData, this.TempData, writer), writer); 

     string value = ((StringWriter)writer.InnerWriter).ToString(); 

     return value; 
    } 
+0

Merci pour cela - tout semble ok sauf pour une chose que je n'ai toujours pas compris - valeur de controlPath. Comment est le chemin élaboré dans MVC? Est-ce le chemin du système de fichiers physique? – codedog

+0

Nevermind ... il semble que "~/Views/blah/blah.cshtml" a fait l'affaire: o) – codedog