asp.net-mvc - renderrazorviewtostring - renderviewtostring does not exist
ASP MVC Ver contenido como JSON (9)
¡Aquí está la respuesta! Es un ligero cambio con respecto al método de Martin From y parece funcionar. Si faltan cosas, por favor, puede la gente contribuir con cualquier cambio de código en la sección de comentarios. Gracias.
Desde tu controlador lo llamas así:
string HTMLOutput = Utils.RenderPartialToString("~/Views/Setting/IndexMain.ascx", "", items, this.ControllerContext.RequestContext);
Agrega esto a una clase
public static string RenderPartialToString(string controlName, object viewData, object model, System.Web.Routing.RequestContext viewContext)
{
ViewDataDictionary vd = new ViewDataDictionary(viewData);
ViewPage vp = new ViewPage { ViewData = vd };
vp.ViewData = vd;
vp.ViewData.Model = model;
vp.ViewContext = new ViewContext();
vp.Url = new UrlHelper(viewContext);
Control control = vp.LoadControl(controlName);
vp.Controls.Add(control);
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
using (HtmlTextWriter tw = new HtmlTextWriter(sw))
{
vp.RenderControl(tw);
}
return sb.ToString();
}
Tengo una aplicación MVC con bastantes acciones de controlador que se llaman con Ajax (jQuery) y devuelvo contenido de vistas parciales que actualiza una parte de la pantalla. Pero lo que preferiría hacer es devolverle a JSON algo como esto.
return Json(new {
Result = true,
Message = "Item has been saved",
Content = View("Partial")
});
Donde el HTML es solo una propiedad del Json. Lo que esto significa es que necesito recuperar el HTML que se representa mediante el método de Vista. ¿Hay alguna forma fácil de hacer esto? Algunos ejemplos que he visto son bastante complicados.
Edición: esta pregunta fue originalmente para ASP.NET MVC 1, pero si la versión 2 lo hace más fácil, me gustaría escuchar la respuesta.
¿Por qué no solo tener "parciales" de html estáticos y capturar todo el contenido dinámico del json? Debería poder cargar los archivos html con jquery cuando la página se cargue o cuando sea necesario con bastante facilidad.
Este enlace en JQuery Ajax da este ejemplo:
//Alert out the results from requesting test.php (HTML or XML, depending on what was returned).
$.get("test.php", function(data){
alert("Data Loaded: " + data);
});
Craig,
Echa un vistazo a esto. Jeffery Palermo ha escrito un SubController para ASP.NET MVC que debe lograr lo que quiere:
MvcContrib - ahora con soporte de SubController para ASP.NET MVC: http://jeffreypalermo.com/blog/mvccontrib-now-with-subcontroller-support/
Encontré una respuesta más reciente usando Razor que puede ser útil http://codepaste.net/8xkoj2
public static string RenderViewToString(string viewPath, object model,ControllerContext context)
{
var viewEngineResult = ViewEngines.Engines.FindView(context, viewPath, null);
var view = viewEngineResult.View;
context.Controller.ViewData.Model = model;
string result = String.Empty;
using (var sw = new StringWriter())
{
var ctx = new ViewContext(context, view,
context.Controller.ViewData,
context.Controller.TempData,
sw);
view.Render(ctx, sw);
result = sw.ToString();
}
return result;
}
Esta es una buena solución al problema: http://craftycode.wordpress.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/
Estoy usando el Asistente de HTML de este artículo: renderizar una vista parcial a la cadena en ASP.NET MVC . ¡Funciona perfectamente!
Llevo años intentando hacer lo mismo. Tengo una solución rápida que deberá extenderse.
NOTA: Ya puedo ver un problema ... Se pierden todas las cookies y otras variables :(
Lo que hice:
Crear nuevo ActionResult
public class JsonHtmlViewResult : ViewResult { public IJsonHtml Data { get; set; } public override void ExecuteResult(ControllerContext context) { if (Data == null) { Data = new DefaultJsonHtml(); } using (StringWriter sw = new StringWriter()) { HttpRequest request = HttpContext.Current.Request; HttpContext.Current = new HttpContext(request, new HttpResponse(sw)); base.ExecuteResult(context); Data.HtmlContent = sw.ToString(); } // Do the serialization stuff. HttpResponseBase response = context.HttpContext.Response; response.ClearContent(); response.ContentType = "application/json"; JavaScriptSerializer serializer = new JavaScriptSerializer(); response.Write(serializer.Serialize(Data)); } }
La clase de datos
public interface IJsonHtml { String HtmlContent { get; set; } } public class DefaultJsonHtml : IJsonHtml { public String HtmlContent { get; set; } }
Las extensiones del controlador.
public static ActionResult JsonHtmlViewResult(this Controller controller, string viewName, string masterName, object model, IJsonHtml data) { if (model != null) { controller.ViewData.Model = model; } return new JsonHtmlViewResult { Data = data, ViewName = viewName, MasterName = masterName, ViewData = controller.ViewData, TempData = controller.TempData }; }
No sé desde qué número de versión puede hacer esto, pero hoy en día puede devolver JSON de una manera muy simple:
public ActionResult JSONaction()
{
return Json(data, JsonRequestBehavior);
}
no hay necesidad de ayudantes elaborados etc.
Por supuesto, los datos son sus datos de su modelo. JsonRequestBehavior especifica si se permiten las solicitudes HTTP GET del cliente. ( source ), es opcional. DenyGet
es el comportamiento predeterminado, por lo que si se usa principalmente JsonRequestBehavior.AllowGet
y here está la razón por la que esto está ahí
NerdDinner tiene algunos ejemplos bastante buenos de esto. Aquí está el SearchController en NerdDinner, que tiene un método llamado SearchByLocation que devuelve una lista de JsonDinners (el código fuente de NerdDinner es Creative Commons):
namespace NerdDinner.Controllers {
public class JsonDinner {
public int DinnerID { get; set; }
public string Title { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public string Description { get; set; }
public int RSVPCount { get; set; }
}
public class SearchController : Controller {
IDinnerRepository dinnerRepository;
//
// Dependency Injection enabled constructors
public SearchController()
: this(new DinnerRepository()) {
}
public SearchController(IDinnerRepository repository) {
dinnerRepository = repository;
}
//
// AJAX: /Search/FindByLocation?longitude=45&latitude=-90
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SearchByLocation(float latitude, float longitude) {
var dinners = dinnerRepository.FindByLocation(latitude, longitude);
var jsonDinners = from dinner in dinners
select new JsonDinner {
DinnerID = dinner.DinnerID,
Latitude = dinner.Latitude,
Longitude = dinner.Longitude,
Title = dinner.Title,
Description = dinner.Description,
RSVPCount = dinner.RSVPs.Count
};
return Json(jsonDinners.ToList());
}
}
}