2010-09-12 30 views
5

En MVC 2 con el motor de vista normal que podría devolver una vista parcial ascx como cadena a través de return Json()vista parcial nuevamente la afeitadora usando JSON (ASP MVC 3)

Pero con las nuevas vistas Razor .cshtml no puedo averiguar como hacer esto. Sigo recibiendo Type 'ASP.CustomerForm_cshtml' does not inherit from 'System.Web.UI.UserControl'.

La vista parcial hereda de System.Web.Mvc.WebViewPage<T> y aparece otro error si heredo de System.Web.UI.UserControl<T> como dice el primer error.

¿Alguna idea sobre cómo solucionar esto utilizando ASP MVC 3 y Razor view engine?

Ésta es mi función 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(); 
    } 

Respuesta

6

Este fuerza que ayuda como he escrito que la parte superior de mi cabeza sin probarlo que no sea para validar devuelve el archivo cshtml prestado.

Supuse que este era un método en un controlador.

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

Gracias, funciona. Obtengo la vista como una cadena. Pero el modelo no está siendo atendido en ninguna parte de su código. Intenté agregar el modelo como parámetro en 'CshtmlView()' pero no tomó el modelo como parámetro. ¿Alguna idea? – Martin

+0

lo resolví, tienes que agregar 'this.ViewData.Model = model;' en tu código, luego funciona: D – Martin

5

Esta es la versión Beta MVC 3 del código:

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

Gracias por eso, todo parece estar bien, excepto por una cosa que todavía no he descubierto: valor de controlPath. ¿Cómo se desarrolla la ruta en MVC? ¿Es la ruta del sistema de archivos físico? – codedog

+0

No importa ... parece que "~/Views/blah/blah.cshtml" hizo el truco: o) – codedog

Cuestiones relacionadas