Me tomó un tiempo, pero encontré una gran solución. La solución de Keith funciona para mucha gente, pero en ciertas situaciones no es la mejor, porque a veces quieres que tu aplicación pase por el proceso del controlador para renderizar la vista, y la solución de Keith simplemente renderiza la vista con un modelo dado I ' Presento aquí una nueva solución que ejecutará el proceso normal.
Pasos generales:
- Crear una clase de utilidad
- Cree un controlador ficticio con una vista ficticia
- En su
aspx
o master page
, llame al método de utilidad para renderizar parcialmente pasando el Controlador, vea y si lo necesita, el modelo a renderizar (como un objeto),
Comprobémoslo de cerca en este ejemplo
1) Cree una clase llamada MVCUtility
y cree los siguientes métodos:
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);
}
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));
}
public static void RenderAction(string controllerName, string actionName, object routeValues)
{
RenderPartial("PartialRender", new RenderActionViewModel() { ControllerName = controllerName, ActionName = actionName, RouteValues = routeValues });
}
Cree una clase para pasar los parámetros, llamaré aquí RendeActionViewModel (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 crea un controlador llamado DummyController
public class DummyController : Controller
{
public ActionResult PartialRender()
{
return PartialView();
}
}
Cree una vista ficticia llamada PartialRender.cshtml
(vista de maquinilla de afeitar) para el DummyController
con el siguiente contenido, tenga en cuenta que realizará otra acción de renderizado utilizando el ayudante Html.
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) Ahora simplemente ponga esto en su archivo MasterPage
o aspx
, para renderizar parcialmente la vista que desee. Tenga en cuenta que esta es una gran respuesta cuando tiene varias vistas de la maquinilla de afeitar que desea mezclar con sus páginas MasterPage
o aspx
. (suponiendo que tengamos un PartialView llamado Inicio de sesión para el controlador).
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
o si tienes un modelo para pasar a la Acción
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
Esta solución es excelente, no usa una llamada ajax , lo que no causará un renderizado retrasado para las vistas anidadas, no crea 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 desea, funciona sin pasar ningún modelo
Gracias al uso de MVC RenderAction dentro de un formulario web