ASP .NET MVC правильная архитектура UserControl - PullRequest
5 голосов
/ 01 апреля 2009

Я пытаюсь изучить новую платформу ASP .NET MVC и хотел бы узнать, как лучше всего использовать UserControls.

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

Я приведу пример, в котором я не понимаю, как элементы UserControls вписываются в шаблон.

У меня есть UserControl, который показывает последние теги (очень похоже на Переполнение стека). В отличие от StackOverflow I хотите отобразить этот UserControl на все мои страницы. Если у меня есть контроллер сказать ВопросКонтроллер который предназначен для обработки действий от некоторые виды вопросов, например посмотреть и подробно, это значит, что я должен получить данные в QuestionController и затем передать его в UserControl?

Если я создам другой контроллер, скажем SearchController тогда мне бы пришлось повторить ту же функциональность получить последние теги для передачи снова частично Разве это не значит, что 2 разных контроллера делают дополнительные вещи, которые они не были изначально намеревался сделать?

Ответы [ 3 ]

4 голосов
/ 28 апреля 2010

Кроме того, в ASP.NET MVC 2 теперь вы можете использовать RenderAction для вызова совершенно нового действия контроллера, которое может извлекать данные. Это делает ваш код намного более модульным, и становится более понятным, откуда поступают данные.

4 голосов
/ 01 апреля 2009

Если ваш UserControl появляется на каждой странице, то одним из способов решения этой проблемы будет использование базового контроллера, из которого все ваши контроллеры получают и генерируют ViewData для UserControl, переопределяя метод OnActionExecuting и помещая туда логику. Если ваш UserControl менее распространен, но все еще часто используется по всему сайту, вы можете расширить ActionFilterAttribute и сделать так, чтобы ваш фильтр генерировал необходимые данные. Этот атрибут можно использовать для украшения контроллеров или действий, которые генерируют представления, использующие UserControl.

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

0 голосов
/ 01 апреля 2009

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

...