Если у меня HomeController, отображающий его индексное представление, как мне поступить, чтобы индексное представление вставляло пользовательский контроль из другого контроллера?
Вот взгляд на содержание Home / Index View:
<%@ 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>
Вот содержимое OtherController:
public class OtherController : BaseController
{
private readonly IRepositoryContract<SomeType> repo = new SomeTypeRepository();
public ActionResult SomeAction()
{
IQueryable<SomeType> items = repo.GetAllItems();
return View("SomeAction", items);
}
}
Это дает мне исключение NullReferenceException, поскольку контроллер никогда не вызывается методом RenderPartial (). Изменение следующей строки
<% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx"); %>
этим
<% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx",((ViewResult) new OtherController().SomeAction()).ViewData.Model); %>
работает, но это ужасно ужасно. Должен быть лучший способ ввести партиалы с другого контроллера?
Обновление :: Решение найдено
Вот код после реализации решения Adrian Grigore :
<%@ 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>