Me tomó un tiempo, pero encontré una gran solución. Como la solución Keith funciona para muchas personas, pero en ciertas situaciones no es la mejor, porque a veces quieres que tu aplicación pase por el proceso del controlador para visualizarla, y la solución de Keith simplemente muestra la vista con un modelo dado Les presento aquí una nueva solución que ejecutará el proceso normal.
Pasos generales:
- crear una clase de utilidad
- Crear un controlador Maniquí con una visión ficticia
- En su
aspx
o master page
, llame al método de utilidad para rendir parcial pasar el controlador, ver y si lo necesita, el modelo a renderizar (como un objeto),
Veámoslo detenidamente en este ejemplo
1) Crear una clase llamada MVCUtility
y crear los métodos siguientes:
//Render a partial view, like Keith's solution
private static void RenderPartial(string partialViewName, object model)
{
HttpContextBase httpContextBase = new HttpContextWrapper(HttpContext.Current);
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Dummy");
ControllerContext controllerContext = new ControllerContext(new RequestContext(httpContextBase, routeData), new DummyController());
IView view = FindPartialView(controllerContext, partialViewName);
ViewContext viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary { Model = model }, new TempDataDictionary(), httpContextBase.Response.Output);
view.Render(viewContext, httpContextBase.Response.Output);
}
//Find the view, if not throw an exception
private static IView FindPartialView(ControllerContext controllerContext, string partialViewName)
{
ViewEngineResult result = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName);
if (result.View != null)
{
return result.View;
}
StringBuilder locationsText = new StringBuilder();
foreach (string location in result.SearchedLocations)
{
locationsText.AppendLine();
locationsText.Append(location);
}
throw new InvalidOperationException(String.Format("Partial view {0} not found. Locations Searched: {1}", partialViewName, locationsText));
}
//Here the method that will be called from MasterPage or Aspx
public static void RenderAction(string controllerName, string actionName, object routeValues)
{
RenderPartial("PartialRender", new RenderActionViewModel() { ControllerName = controllerName, ActionName = actionName, RouteValues = routeValues });
}
crear una clase para pasar los parámetros, que llamaré aquí RendeActionViewModel (que puede crear en el mismo archivo de la Clase MvcUtility)
public class RenderActionViewModel
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public object RouteValues { get; set; }
}
2) Ahora crear un controlador llamado DummyController
//Here the Dummy controller with Dummy view
public class DummyController : Controller
{
public ActionResult PartialRender()
{
return PartialView();
}
}
Crear una vista simulada llamada PartialRender.cshtml
(vista de afeitar) para la DummyController
con el siguiente contenido, tenga en cuenta que se llevará a cabo otra inutilidad la actuación mediante el asistente de HTML
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) Ahora sólo hay que poner esto en su MasterPage
o aspx
archivo, para renderizar parcialmente una vista que desee. Tenga en cuenta que esta es una gran respuesta cuando tiene varias vistas de maquinilla de afeitar que desea mezclar con sus páginas MasterPage
o aspx
.(Suposing tenemos un PartialView llamada Acceder al controlador principal
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
o si tiene un modelo para pasar a la acción
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
Esta solución es grande, no utiliza ajax llamada , que no causará un retraso en el procesamiento para las vistas anidadas, no hace una nueva WebRequest por lo que no le traerá una nueva sesión, y procesará el método para recuperar el ActionResult para la vista que desee, funciona sin pasar cualquier modelo
Gracias aUsing MVC RenderAction within a Webform
tengo el mismo problema - Html.RenderPartial no pueden trabajar en WebForms, pero todavía debería haber una manera de hacer esto. – Keith