Частичные представления в MVC - PullRequest
5 голосов
/ 19 ноября 2010

Я новичок в MVC и только что натолкнулся на сценарий, с которым мне нужна помощь.

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

СЦЕНАРИЙ:

У меня есть домашняя страница, на которой перечислены последние 10 сообщений в блоге, а также «Дерево архивов» (перечисление лет / месяцев в хронологическом порядке со ссылками на каждую из записей блога, сделанных в эти годы / месяцы).

Я создаю это «дерево архивов» в качестве пользовательского элемента управления и выводю этот элемент управления на мою домашнюю страницу.

Я также вывожу этот пользовательский элемент управления Archive Tree вниз по стороне моей главной страницы блога - на странице блога отображаются подробности только для одного сообщения в блоге.

Я также хочу повторно использовать этот элемент управления Archive Tree на нескольких других страницах моего веб-приложения.

MVC:

У меня есть контроллер 'PhotoController', в котором есть метод ActionResult, отвечающий за получение сведений о выбранном сообщении в блоге (id).

Я хочу включить частичное представление (дерево архивов, которое будет отображать несколько записей) на странице моего фотоблога, которое будет циклически проходить по нескольким записям фотографий (List<Photo>).

Я мог бы создать модель представления, состоящую из свойства 'Photo' (для отображения деталей записи отдельного фото-блога) и второго свойства, называемого PhotoArchive, которое представляет собой List<Photo>.

Хотя я обеспокоен этим подходом, когда я перехожу к частичному представлению 'Archive Tree' в некоторых других разделах сайта, мне не обязательно проходить через ту же модель представления. (который содержит объекты «Photo» и «PhotoArchive») для родительского представления. Например, моей домашней странице не нужно будет проходить через объект «Фотография» к представлению, которое отображает домашнюю страницу, но я все еще хочу вывести мой частичный вид «Дерево архива» среди остальной части HTML на моей домашней странице.

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

Ответы [ 4 ]

2 голосов
/ 19 ноября 2010

Есть несколько способов добиться этого:

Вы можете просто использовать Html.RenderAction() http://www.asp.net/mvc/videos/aspnet-mvc-2-render-action

Или вы можете использовать разные модели просмотра

class HomePageViewModel {
  IEnumerable<Blog> PhotoArchive { get; set; }
}
class BlogPageViewModel {
  IEnumerable<Blog> PhotoArchive { get; set; }
  Blog Photo { get; set; }
}

и передайте свойство PhotoArchive при вызове Html.RenderPartial("view", model.PhotoArchive)

Или вы можете использовать и интерфейс

interface IMyViewPage {
  IEnumerable<Blog> PhotoArchive { get; set; }
}
class MyViewModel : IMyViewPage{
  //...
  Blog PhotoBlog { get; set; }
}

и Model.RenderPartial("view", model)

2 голосов
/ 19 ноября 2010

Вы можете решить эту проблему, сделав модель вашего частичного представления List<Photo> (или даже лучше, IEnumerable<Photo>).Когда вы вызываете RenderPartial, вы можете использовать перегрузку (string, object), чтобы указать объект для передачи в представление для представления:

<% Html.RenderPartial("PartialView.ascx", ViewData.Model.PhotoArchive) %>
0 голосов
/ 15 января 2015

В Index.cshtml

     @Html.Partial("_Index");

В _index.cshtml

   <table>
     whatever 
   </table
0 голосов
/ 19 ноября 2010

Определите интерфейс, например IArchiveTree, который описывает структуру модели древовидного представления, затем создайте все объекты модели, которые вы хотите отобразить, когда деревья реализуют этот интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...