Jeśli mam kontrolkę HomeController wyświetlającą jej widok indeksu, w jaki sposób postępowałbym, aby widok indeksu osadzał kontrolkę UserControl z innego kontrolera?Jak renderować części z innego kontrolera?
Oto spojrzenie na treści Home/Index Widok:
<%@ 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>
Oto treść OtherController:
public class OtherController : BaseController
{
private readonly IRepositoryContract<SomeType> repo = new SomeTypeRepository();
public ActionResult SomeAction()
{
IQueryable<SomeType> items = repo.GetAllItems();
return View("SomeAction", items);
}
}
To daje mi NullReferenceException ponieważ kontroler nigdy nie jest wywoływana przez Metoda RenderPartial(). Zmiana następującą linię
<% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx"); %>
przez tego
<% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx",((ViewResult) new OtherController().SomeAction()).ViewData.Model); %>
prac, ale na pewno jest brzydki jak cholera. Musi istnieć lepszy sposób na osadzanie części z innego kontrolera?
Aktualizacja :: Rozwiązanie znaleziono
Oto kod po wdrożeniu Adrian Grigore „s rozwiązanie: partials
<%@ 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>
To działa świetnie! Dziękuję Panu. Zmieniłem <% Html.RenderPartial ("~/Views/OtherController/SomeAction.ascx"); %> linia <% Html.RenderAction ("SomeAction", "OtherController"); %> i działa cudownie, wywołując OtherController i wyświetlając poprawne dane. –