Si tengo un HomeController que muestra su vista de índice, ¿cómo procedo para que la vista de índice incorpore un UserControl de otro controlador?Cómo renderizar parciales de otro Controlador
Aquí está una mirada en el contenido del Home/Índice de Vista:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
<%=Resources.Global.HomeTitle %>
</asp:Content>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<p><%=Resources.Global.HomeIndex %></p>
<h3>Partial title</h3>
<% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx"); %>
</asp:Content>
Aquí está el contenido OtherController:
public class OtherController : BaseController
{
private readonly IRepositoryContract<SomeType> repo = new SomeTypeRepository();
public ActionResult SomeAction()
{
IQueryable<SomeType> items = repo.GetAllItems();
return View("SomeAction", items);
}
}
Esto me da una NullReferenceException ya que el controlador no está siendo llamado por el Método RenderPartial() Cambio de la siguiente línea
<% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx"); %>
por este
<% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx",((ViewResult) new OtherController().SomeAction()).ViewData.Model); %>
obras, pero seguro que es feo como el infierno. Tiene que haber una mejor forma de partials embebidos de otro controlador?
actualización :: solución encontrada
Aquí está el código después de implementar Adrian Grigore 's solución: parciales
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="Microsoft.Web.Mvc"%>
<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
<%=Resources.Global.HomeTitle %>
</asp:Content>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<p><%=Resources.Global.HomeIndex %></p>
<h3>Partial title</h3>
<% Html.RenderAction("SomeAction","OtherController"); %>
</asp:Content>
¡Eso funciona genial! Gracias Señor. Cambié el <% Html.RenderPartial ("~/Views/OtherController/SomeAction.ascx"); %> línea por <% Html.RenderAction ("SomeAction", "OtherController"); %> y funciona de maravilla, llama al OtherController y muestra los datos correctos. –