Что является хорошим способом для создания подвидов с логикой в ​​ASP.NET MVC 3 - PullRequest
4 голосов
/ 05 октября 2011

Мы создаем бизнес-приложение с использованием Microsoft ASP.NET MVC 3. Некоторые представления теперь становятся настолько сложными, что кажется разумным разделить их на два или более отдельных представления с отдельными контроллерами и моделями.(Повторное использование - еще одна причина желания создавать отдельные представления.)

Какой метод вы рекомендуете для достижения такого разделения в ASP.NET MVC?Частичные представления кажутся очевидным ответом, но, как я понимаю, частичные представления «из коробки» практически не поддерживают отдельные контроллеры.

Наилучшее решение, которое мы нашли до сих пор, это использованиеHtml.RenderAction("<view initialization action method>")метод, как описано здесь: http://www.primaryobjects.com/CMS/Article129.aspx

В этом посте также упоминается метод RenderAction: ASP .NET MVC правильная архитектура UserControl

Видите ли вы какие-либо недостатки этого подхода?Вы рекомендуете лучшие, более легкие способы достижения этого?

Ответы [ 4 ]

5 голосов
/ 05 октября 2011

Возьмите вид "Детали сообщения".Составное представление, в котором отображаются «Сводка по публикациям» и «Комментарии к публикациям».

При частичном подходе вы получите:

public class PostDetailModel
{
    PostSummaryModel Summary { get;set; }
    PostCommentsModel Comments { get;set; }
}

и представление:

<div id="post_detail">
    @Html.Partial("Summary", Model.Summary)

    <ul class="comment-list">
    @foreach(var comment in Model.Comments)
    {
        <li>@Html.Partial("Comment", comment)</li>
    }
    </ul>
</div>

Это означает, что метод PostController.Detail будет отвечать за построение PostSummaryModel, построение PostCommentsModel и выбор того, какие партиалы использовать для рендеринга каждого.

Если у вас также тогда была следующая модель:

public class PostListModel
{
    ICollection<PostSummaryModel> Posts { get;set; }
}

У вас будет два действия, отвечающих за построение PostSummaryModel и знание того, какой частичный элемент использовать.Если ваше приложение не структурировано должным образом, это может привести к дублированию кода доступа к данным / модели.Но если вы делегируете и абстрагируете построение модели в фабрики моделей многократного использования (которые могут быть вызваны обоими действиями), вы минимизируете этот риск.

С другой стороны, используя подход Html.Action, ваша модель просто становится:

public class PostDetailModel
{
    int PostId { get;set; }
}

и представление:

<div id="post_detail">
    @Html.Action("Summary", new { Model.PostId })

    @Html.Action("Comments", new { Model.PostId }) 
</div>

Затем можно оставить действия «Сводка» и «Комментарии», чтобы создать собственную модель и выбрать представление.

Однако при выборе подхода Html.Action наблюдается очень незначительное снижение производительности, поскольку ASP.NET MVC должен пройти через весь процесс связывания модели, выполнения фильтров действий, проверки и т. Д., Поэтому вы, вероятно, не будете использовать Html..Действие по отображению элементов в достаточно длинном списке.Но для создания составного представления это может быть действительно чистый способ склеить полдюжины или около того существующих представлений.

2 голосов
/ 05 октября 2011

Я думаю, вы должны пойти с Action или RenderAction, как указывает Дарин, если вы хотите иметь логику в своем представлении.Тем не менее, есть «хакерское» решение, которое вы можете использовать, и которое заключается в реализации вашего собственного IViewPageActivator.Тогда вы могли бы сделать так, чтобы ваши представления реализовали пользовательские WebViewPage и внедрили сервисы в этом WebViewPage, и они будут доступны вашим представлениям.Подводя итог:

  • Используйте Partial или RenderPartial, если вам нужно только ввести модель
  • Используйте Action или RenderAction, если у вас есть логика в вашей частичнойview
  • Реализация IViewPageActivator и некоторые другие вещи, если вам действительно нужно

ОБНОВЛЕНИЕ: Кроме того, в простых сценариях помощники могут выполнять работу за вас в зависимостина то, что вы пытаетесь достичь.

1 голос
/ 05 октября 2011

Взгляните на клиентский сайт MVC Javascript Framework для управления сложным пользовательским интерфейсом.В сочетании с шаблонизацией jquery очень мощный и возможность следить ...

Backbone.js http://documentcloud.github.com/backbone/

Kockout.js http://knockoutjs.com/

Knockoutjs против Backbone.js - часть 1 http://ifandelse.com/?p=61

Knockout.js против Backbone.js - часть 2 http://ifandelse.com/?p=70

0 голосов
/ 05 октября 2011

Html.Action и Html.RenderAction - это лучший способ для извлечения некоторой повторяющейся сложной логики в представлениях, для которых требуются собственные контроллеры и модели.

...