Html.RenderPartial call с главной страницы - PullRequest
8 голосов
/ 08 сентября 2008

Вот сценарий: допустим, у меня есть сайт с двумя контроллерами, отвечающими за отображение разного типа контента - страниц и статей. Мне нужно встроить частичное представление в мою главную страницу, где будут перечислены страницы и статьи, отфильтрованные по некоторым критериям, и будут отображаться на каждой странице. Я не могу установить модель на своей главной странице (я прав?). Как мне решить эту задачу, используя Html.RenderPartial?

[EDIT] Да, я бы, вероятно, создал отдельные частичные представления для перечисления статей и страниц, но, тем не менее, существует барьер, который я не могу и не должен устанавливать модель на главной странице. Мне нужно как-то сказать «вот страницы» в качестве аргумента для моего рендеринга, а также для статей. Вся концепция рендеринга с данными из базы данных на мастер-страницах для меня немного размыта.

Ответы [ 7 ]

2 голосов
/ 28 мая 2009

Как насчет создания метода расширения HtmlHelper, который позволяет вызывать результат частичного просмотра для действия на контроллере.

Что-то вроде

 public static void RenderPartialAction<TController>(this HtmlHelper helper, Func<TController, PartialViewResult> actionToRender)
    where TController : Controller, new()
{
    var arg = new TController {ControllerContext = helper.ViewContext.Controller.ControllerContext};
    actionToRender(arg).ExecuteResult(arg.ControllerContext);
} 

Вы можете использовать это на своей главной странице как

<% Html.RenderPartialAction((HomeController x) => x.RenderPartial()) %>

и в вашем контроллере соответствующий метод

public PartialViewResult RenderPartial()
{

     return PartialView("~/Path/or/View",_homeService.GetModel())
}

Ну, так или иначе, это мои 2 цента

1 голос
/ 19 декабря 2009

Я думаю, что ваше решение может лежать в стране MVC 2.0 RC и за ее пределами ...

Фил Хаак опубликовал статью в своем блоге: http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

1 голос
/ 13 марта 2009

У меня был аналогичный пост , и я придумал объектную модель для его обработки.

Я НЕНАВИЖУ не строго типизированные представления, так что я использовал этот подход, и он работает хорошо.

0 голосов
/ 08 января 2010

Это очень поздний ответ, но я попал на эту страницу, пока гуглял - так что есть вероятность, что кто-то еще увидит этот вопрос (и мой ответ) также.

Я обошел эту проблему, используя простой скрипт jQuery для загрузки PartialView и выполнения кода его контроллера. Образец ниже.

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

    <script type="text/javascript">
            $(document).ready(function() {
            $("#applicationForm").load("/Home/ApplicationForm");
            });
    </script>

    <div id="applicationForm" />

</asp:Content>

Большим недостатком этого подхода является то, что клиент должен иметь включенные сценарии, чтобы он работал (так что это действительно недружелюбно относится к SEO). Если это то, что вы можете жить с этим хорошо работает. Я использую его только на сайте интрасети, где я знаю, что на каждом клиенте включен JavaScript, и мне не нужно беспокоиться о ботах Google.

0 голосов
/ 13 ноября 2009

Я справляюсь с этим, используя BaseViewModel. Все представления строго типизированы для модели представления, которая наследуется от BaseViewModel.

Класс BaseViewModel содержит всю информацию, необходимую для MasterPage. Поэтому для навигации ваша BaseViewModel может выглядеть так:

public class BaseViewModel
{
    public BaseViewModel()
    {
         NavigationItems = RetrieveNavigationItemsFromModel();
    }
    public List<NavItems> NavigationItems {get; set;}
}

В ваших MasterPage и PartialViews вы можете привести Модель к BaseViewModel и получить доступ к свойству NavigationsItems.

<ul>
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %>
    <li>
        <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a>
    </li>
<% } %>
</ul>
0 голосов
/ 08 сентября 2008

да, это правильно. но давайте посмотрим на этот сценарий: для представлений, связанных со статьями, у меня есть ViewData ["article"], а для представлений, связанных со страницами, у меня есть ViewData ["pages"], но у меня не все статьи и страницы доступны постоянно. Итак, если я добавлю:

Html.RenderPartial ("ArticlesView", ViewData ["article"])

Html.RenderPartial ("pagesView", ViewData ["pages"])

На моей главной странице на каждой странице будет создаваться исключение, на котором ViewDataDictionary не содержит ни статей, ни страниц.

По крайней мере, так я это вижу.

0 голосов
/ 08 сентября 2008

Свойство ViewData Model следует использовать только для контента, который вы просматриваете / редактируете в основном разделе пользовательского интерфейса.

Для других частей представления могут потребоваться некоторые данные, присутствующие в ViewData, поэтому просто добавьте их в словарь.

Я бы просто передал данные из словаря следующим образом: ViewData ["article"] в частичное. (или ViewData.Get () из MvcContrib).

Вы также можете взглянуть на недавно реализованный шаблон SubController, реализованный в MvcContrib .

...