---
title: "Кнопка &quot;Версия для печати&quot; в OXITE"
description: "Вполне обычная кнопка \"Версия для печати\". Причем, хотелось бы такую кнопку вставлять куда угодно и ..."
author: "tarakanoffth"
published: "2010-09-23T03:21:57+00:00"
modified: "2010-09-23T03:21:57+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/knopka-quot-versiya-dlya-pechati-quot-v-oxite-74560"
markdown_url: "https://yvision.kz/post/knopka-quot-versiya-dlya-pechati-quot-v-oxite-74560/markdown"
site_name: "Yvision.kz"
---

# Кнопка &quot;Версия для печати&quot; в 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/), модели не модифицируются (они не обязаны "думать", как они должны выводиться на печать), можно использовать нестандартные версии для печати (представления).

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

---

Source: [https://yvision.kz/post/knopka-quot-versiya-dlya-pechati-quot-v-oxite-74560](https://yvision.kz/post/knopka-quot-versiya-dlya-pechati-quot-v-oxite-74560)