2009-05-01 4 views
4

Я использую View Components в некоторых более крупных приложениях, которые я построил в монорельсе. Каков эквивалентный подход в ASP.Net MVC для компонента вида, который может поддерживать разделы и т. Д.?Существует ли эквивалент компонентов представления монорельсов для ASP.Net MVC Framework?

ответ

0

Phil Haack blogged о создании областей для группировки контроллеров в подпапки/секции, похожие на MonoRails.

+0

Разделы в компоненте вида в монорельсе не совпадают с областями, они больше похожи на именованные шаблоны элементов, которые могут использоваться компонентом вида при его рендеринге - см. Сообщение ayende для хорошего описания: http: // ayende.com/Blog/archive/2007/04/08/Building-View-Components-For-MonoRail.aspx – Bittercoder

2

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

1: Проще всего создать ViewUserControl и отобразить его с помощью Html.RenderPartial с помощником. ViewUserControl - это простая часть разметки без контроллера поддержки (я думаю, вы можете поместить файл кода, если хотите). При желании, вы можете передать объект модели или весь словарь 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 с соответствующими параметрами. Это создаст конвейер mini mvc, который создаст контроллер, разрешит представление и т. Д., Как и Monorail ViewComponent. Я предпочитаю использовать вариацию на основе лямбда-метода, например:

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

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

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

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

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

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

+0

Спасибо за подробный отклик, я использовал частичные файлы, но еще не пробовал действие рендеринга - выглядит интересно. К сожалению, это по-прежнему не помогает мне заменить компоненты вида, которые я в настоящее время имею/люблю в монорельсе, которые сильно используют разделы (http://ayende.com/Blog/archive/2007/04/08/Building-View -Components-For-MonoRail.aspx) - похоже, мне, возможно, потребуется провести какое-то дальнейшее исследование, чтобы увидеть, есть ли способ эмулировать это поведение. – Bittercoder

+0

@Bittercoder вы могли найти что-нибудь о замене компонентов вида на использование тяжелых секций? – Tinister