Yvision.kzYvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
-4
03:21, 23 сентября 2010

Кнопка "Версия для печати" в OXITE

Вполне обычная кнопка "Версия для печати". Причем, хотелось бы такую кнопку вставлять куда угодно и получать "легкую" печатную версию чего угодно в OXITE. Мне на ум пришло три варианта реализации такого функционала.

Описываю варианты в последовательности возникновения в голове.

1. IPrinted. Понятно, что интерфейс. С методом GetPrintedVersion(). Этот интерфейс должны реализовывать все модели сущностей, которые я хочу представлять в печатной версии. В частности, реализация метода GetPrintedVersion(), должна будет возвращать объект класса PrintModel, который имеет стандартный набор свойств, типа Title, Body, DateCreated, UserCreated и пр. Ну, а модель PrintModel, можно передать общему (shared) представлению (легкой .aspx странице, хотя можно применить и частичное представление .ascx).

Контроллеры моделей получат экшен-методы Print(), которые будут получать модель PrintModel и передавать её в представление.

2. Не заморачиваться объектной ориентацией и просто набросать для контроллеров моделей экшен-методы Print(T model), которые будут передавать нестандартный набор каких-то данных (для печатных версий может быть и такое), в виде списка (dictionary) в какое-то нестандартное представление (легкой .aspx странице или частичному представлению .ascx).

3. Создать контроллер печати PrintController, который будет иметь единственный экшен-метод Print(T printModel), получающий модель PrintModel и передавать её в какое-то общее (shared) представление (.aspx или .ascx). И создать компоновщик модели (model binder), в котором реализовывать по мере надобности преобразование любой модели в модель PrintModel и передавать её в контроллер PrintController для печати.

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

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

Третий способ собирает весь механизм в один контроллер и один модел-биндер. Определяется одно соглашение для печатной модели (PrintModel). Не нужно модифицировать исходный код моделей и контроллеров (значимое преимущество). Но получится весьма громоздкий модел-биндер (в зависимости о того, сколько "версий печати" каких-либо сущностей у меня будет), к тому же жестко привязанный к роутам.

4. Контроллеры получат экшен-метод Print(T model), который будет преобразовывать модель T в модель для печати PrintModel и передавать её представлению (.aspx или .ascx). Нет привязки к роутам (к ссылкам будет достаточно прибавить секцию /print/), модели не модифицируются (они не обязаны "думать", как они должны выводиться на печать), можно использовать нестандартные версии для печати (представления).

Остановился на четвертом способе. :)

-4
230
0