Как визуализировать партиалы с другого контроллера - PullRequest
9 голосов
/ 28 августа 2009

Если у меня 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>

Ответы [ 4 ]

5 голосов
/ 28 августа 2009

Используйте метод Html.RenderAction из библиотеки ASP.NET MVC Futures .

4 голосов
/ 28 августа 2009

Поместите части, используемые более чем одним контроллером, в общую папку.

Модель должна передаваться по странице. Построить это в контроллере, а не в поле зрения. Затем передайте это так:

<% Html.RenderPartial("SomeAction", Model.SomeActionData); %>

Обратите внимание, что если Model.SomeActionData имеет значение null, MVC передаст Model вместо Model.SomeActionData. Убедитесь, что ваш код может это терпеть.

2 голосов
/ 28 апреля 2013

Вы все еще можете использовать «Частично» в случае, если вы поместите свой вид в каталог «Shared».

Это решение очень простое и обслуживаемое, если у вас есть общие представления или элементы управления, надеясь, что оно также является альтернативой и полезно для вас ...

0 голосов
/ 29 августа 2009

Похоже, у вас должен быть общий UserControl на главной странице (возможно, вложенный), чтобы представлению не нужно было знать о контроллерах, кроме его родительских. У Стивена Вальтера есть несколько хороших стратегий для передачи данных на главные страницы и пользовательские элементы управления.

  1. Код на главной странице (BAD)
  2. ActionFilter
  3. Вызов частичного напрямую
  4. Абстрактные базовые классы контроллеров
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...