Существует ли эквивалент компонентов монорельсовой проекции для ASP.Net MVC Framework? - PullRequest
4 голосов
/ 01 мая 2009

Я интенсивно использую Просмотр компонентов в некоторых крупных приложениях, которые я построил в Monorail. Что такое эквивалентный подход в ASP.Net MVC для компонента представления, который может поддерживать разделы и т. Д.

Ответы [ 2 ]

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

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

1 Самое простое - создать ViewUserControl и отобразить его, используя Html.RenderPartial с помощником. ViewUserControl - это простая часть разметки без резервного контроллера (я думаю, что вы можете поместить файл codebehind, если хотите). При желании вы можете передать объект модели или весь словарь ViewData представлению при вызове RenderPartial, например:

<% Html.RenderPartial("TopBar", model); %>

"TopBar" является страницей ascx. Это работает где угодно, на главных страницах и в обычных представлениях.

2: Если вы хотите, чтобы ваш компонент имел более сложную логику или имел доступ к источникам данных, IoC и т. Д., Вы можете использовать Html.RenderAction, который является методом расширения, найденным в сборке Microsoft.Web.Mvc. Я использую это из дистрибутива mvccontrib. Это работает так: вам нужно создать обычный контроллер со всей необходимой логикой, затем создать несколько представлений, и все эти вещи станут вашим компонентом, например:

public class AboutComponentController : Controller {
public IRepository Repository{ get; set; }

public ActionResult Detail() {
    var lastEvent = Repository.FindAll<Auditoria>().FirstOrDefault();
    return View(lastEvent);
}

}

Обратите внимание на то, что у меня есть ссылка на IRepository, который будет вводиться с помощью IoC (в моем случае Windsor), и я могу делать все, что делает обычный контроллер.

Теперь на любой странице (главной или обычной), где вы хотите использовать свой компонент, импортируйте Microsoft.Web.Mvc и вызовите Html.RenderAction с соответствующими параметрами. Это создаст мини-конвейер MVC, который создает контроллер, разрешает представление и т. Д., Как Monorail ViewComponent. Я предпочитаю использовать лямбда-вариацию метода, например:

<% Html.RenderAction<AboutComponentController>(x => x.Detail("a message"));%>

К сожалению, единственный способ передать параметры - использовать сам вызов метода, который, в свою очередь, должен быть уникальным в контроллере. Еще нужно немного поработать, чтобы походить на ViewComponent.

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

Помните, что при использовании механизма представления Webforms вы можете иметь строго типизированные представления, если вы хотите иметь intellisense при использовании переменной Model в блоках кода.

Прелесть этого в том, что вы можете смешивать движки представлений с этими подходами, я обычно создаю компоненты в nvelocity и отображаю их на страницах aspx и т. Д.

У меня сейчас могут быть проблемы с кэшированием частичных представлений, но я до сих пор не сталкивался с ними. Я уверен, что есть другие варианты (например, субконтроллеры в mvccontrib), но этого обычно достаточно для простых случаев. Конечно, вы можете использовать обычные компоненты ASP.net на страницах просмотра aspx, но это было бы обманом, верно? хе-хе. Надеюсь, это поможет.

0 голосов
/ 02 мая 2009

Фил Хаак написал в блоге о создании областей для группировки контроллеров в подпапки / разделы, похожие на MonoRails.

...