Использование фильтров для мобильных элементов управления
Теперь давайте рассмотрим, как использовать фильтры для настройки содержимого, генерируемого мобильными элементами управления. Оба описанных фильтра предназначены для определения цветовых возможностей запрашивающего устройства, так что вполне естественно, если мы рассмотрим их применение для элемента управления <mobile:Image>. Ниже показан пример элемента управления <mobile:Image>, который не использует фильтры.
<mobile:Image runat="server" ImageURL="logo.gif" />
Данный элемент управления отображает файл logo.gif на всех устройствах, с которых осуществляется доступ к вашей странице. Это хорошо для настольных компьютеров и ноутбуков, но мобильные устройства требуют, чтобы изображение было настроено в соответствии с цветовыми возможностями устройства. Для использования в этом элементе управления фильтров из предыдущего раздела применим элемент <DeviceSpecific>. Этот элемент служит для указания параметров, связанных с фильтрами, в любом мобильном элементе управления. Ниже приведен его синтаксис.
<mobile:Image runat="server" ImageURL="logo.gif"> <DeviceSpecific> <Choice Filter="filter name" ControlProperty1="value" ControlProperty2="value" /> </DeviceSpecific> </mobile:Image>
В элементе <choice> можно указать любое количество свойств элемента управления. Если элемент управления отображается, и фильтр возвращает значение true, то к этому элементу применяются свойства из элемента <choice>. Ниже приведен пример использования двух определенных ранее фильтров.
<mobile:Image runat="Server" ImageURL="logoBW.gif"> <DeviceSpecific> <Choice Filter="IsColor" ImageURL="logoColor.gif" /> <Choice Filter="IsHighColor" ImageURL="logoHighColor.gif" /> </DeviceSpecific> </mobile:Image>
Рассмотрим порядок событий, возникающих при отображении данного элемента управления.
Свойство ImageURL устанавливается в значение logoBW.gif (черно-белый логотип).Обрабатываются элемент <DeviceSpecific> и включенный в него элемент <choice>.Если фильтр IsColor возвращает значение true, свойству ImageURL присваивается значение logoColor.gif, при возвращении false фильтр не выполняется.Если фильтр IsHighColor возвращает значение true, свойству ImageURL присваивается значение logoHighColor.gif, при возвращении false фильтр не выполняется.Элемент управления <mobile:Image> отображается с использованием свойства ImageURL.
Подобное использование фильтров позволяет настраивать свойства элемента управления, основываясь на любом количестве возможностей браузера или другом критерии.
Ключевые моменты
В разделе <mobileControls> объявляются и настраиваются адаптеры, используемые при генерации содержимого для конкретных форматов, включая HTML, CHTML и WML.Использование в качестве основы примеров кода, доступных в MMIT, облегчает создание собственных адаптеров для новых мобильных устройств.В разделе <deviceFilters> можно создать фильтры для проверки возможностей браузера, возвращающих либо значение true, либо значение false.Элемент <DeviceSpecific> позволяет настроить вывод отдельного мобильного элемента управления с помощью фильтров, определенных в разделе <deviceFilters>.Microsoft периодически выпускает обновления устройств, использующих мобильные элементы управления, с модификацией кода определения браузера, новых адаптеров и других настроечных параметров, предназначенных для работы с мобильными устройствами.
Настройка свойств <mobileControls>
Свойства элемента <mobileControls> – это глобальные параметры среды выполнения для мобильных устройств. Они позволяют настраивать то, как среда мобильных устройств поддерживает состояние и включены ли пользовательские атрибуты. В таблице 5.2 содержится перечень свойств элемента <mobileControls>.
allowCustomAttributes | Определяет, могут ли страницы содержать пользовательские атрибуты. Их наличие позволяет включать в элементы управления атрибуты, специфичные для конкретного адаптера. Все добавленные в элемент управления атрибуты сохраняются как пользовательские и доступны всем адаптерам, интерпретирующим данный элемент управления. |
sessionStateHistorySize | Определяет максимальный размер (в Кб) сохраняемой в сессии истории. Так как обычно мобильные устройства имеют ограниченное количество свободной памяти, и большинство из них не могут хранить cookies, состояние сессии и информация о состоянии представления хранится в переменных сессии. |
cookielessDataDictionaryType | Определяет класс словаря, который содержит аутентификационную информацию, вводимую с помощью формы, не использующей cookies. Можно отключить эту функцию, установив данное свойство равным пустой строке. |
Ниже показан пример раздела <mobileControls>, отображающий только эти свойства.
<mobileControls allowCustomAttributes="true" sessionStateHistorySize="6" cookielessDataDictionaryType="System.Web.Mobile.CookielessData"> </mobileControls>
Использование пользовательских атрибутов. Установка свойства allowCustomAttributes в значение true включает пользовательские атрибуты для всех мобильных элементов управления. Это означает, что вы можете указать любой тип свойства в мобильном элементе управления, и он будет сохранен и передан в адаптер. Применение данных атрибутов позволяет указать атрибуты, которые будут использоваться только конкретным адаптером. Любое свойство, установленное для элемента управления, которое не распознается как свойство по умолчанию для этого элемента, сохраняется и передается в адаптер. Например, для добавления свойства элементу mobile:Label используется следующий синтаксис.
<mobile:Label runat="server" id="lblLabel" text="Our Label Text" wmlFormat="NNN" />
Свойство wmlFormat будет сохранено и передано в адаптер, который обрабатывает данный элемент управления. Это свойство использует адаптер WML; остальные адаптеры его игнорируют.
Предостережение. Если вы случайно введете "txt" вместо "text", элемент управления вместо информирования об ошибке из-за неправильного имени свойства сохранит это свойство как пользовательский атрибут.Затем адаптер получает к свойству доступ с помощью класса словаря CustomAttributes и использует это свойство для генерации собственного содержимого для клиента.
Обновление устройств мобильных элементов управления
Наиболее важной частью настройки приложений для мобильных устройств является обеспечение гарантии того, что вы сможете обнаружить и правильно определить возможности большого количества различных мобильных устройств. По умолчанию ASP.NET обнаруживает множество устройств, но, как вы знаете, каждый день их количество растет. Поэтому Microsoft периодически выпускает Mobile Controls Device Updates (Обновления мобильных устройств для элементов управления). Эти обновления включают обновления для следующих разделов.
Настроечные параметры <browserCaps>.Настроечные параметры <mobileControls>.Сборки адаптеров.Настроечные параметры <assemblies>.
Было опубликовано два таких обновления, но поскольку они кумулятивны, то потребуется установить самый последний. Одной из функций, включенных в доступное на момент написания книги обновление устройств, является новый адаптер XHTML. Этот адаптер генерирует для мобильных устройств с поддержкой XHTML содержимое, совместимое с XHTML. В будущем можно ожидать появления других обновлений, включая определение новых браузеров, новые адаптеры и прочее. Чтобы скачать наиболее свежее обновление браузера, проверьте веб-страницу новых выпусков
http://msdn.microsoft.com/vstudio/device/mobilecontrols/aspmobiledrivers.asp.
Работа с разделом <deviceFilters>
Аналогично разделу <mobileControls>, раздел <deviceFilters> также используется для настройки содержимого, отсылаемого клиенту. В нем настраиваются фильтры, дающие во время выполнения значения true или false. Далее с их помощью принимается решение о том, какое содержимое должно отсылаться клиенту. Имеется два различных типа фильтров.
Фильтры сравнения. Используются для выполнения базового сравнения возможности и значения, указанного в фильтре. Можно использовать любую возможность, прочитанную из класса MobileCapabilities.Фильтры делегатов оценки. Фильтры оценки создают собственный метод, который возвращает true или false. С помощью данного метода можно проверить возможности и выполнить другие проверки для определения того, должен ли этот фильтр возвращать true или false.
Оба типа фильтров реализуют в разделе <deviceFilters> элемент <filter>. Ниже приведен синтаксис <deviceFilters> для обоих типов.
<system.web> <deviceFilters> <filter name="filter name" compare="capability name" argument="value to match" /> <filter name="filter name" type="class name" method="method name" /> </deviceFilters> </system.web>
Первый фильтр в приведенном фрагменте – фильтр сравнения, второй – фильтр оценки. Свойства элемента <filter> указаны в табл. 5.5.
name | Определяет уникальное имя фильтра. Это имя используется для вызова фильтра в коде. Если вы укажете имя существующего фильтра, оно будет переопределено. |
compare | Определяет имя возможности, которую нужно проверить, – это любая из возможностей, включенных в класс mobileCapabilities или добавленная собственная возможность. Свойство используется при создании фильтров сравнения. |
argument | Определяет аргумент, используемый при сравнении с возможностью, указанной в свойстве compare. Свойство используется при создании фильтров сравнения. |
type | Определяет класс, предоставляющий оценочный метод. Значение свойства должно соответствовать стандартам .NET по полному указанию класса. Свойство используется при создании оценочных фильтров. |
method | Определяет метод, с помощью которого определяется значение, возвращаемое фильтром (true или false). Свойство используется при создании оценочных фильтров. |
Работа с разделом <mobileControls>
Раздел <mobileControls> определяет набор адаптеров, соответствующих мобильным элементам управления ASP.NET. Адаптер – это класс, который настраивает каждый мобильный элемент управления для конкретного мобильного устройства или языка. В таблице 5.1 содержится перечень адаптеров, установленных в MMIT по умолчанию.
HTML | Используется для устройств, которые понимают HTML 3.2 без клиентских сценариев. |
CHTML | Используется для устройств, которые понимают HTML 3.0 без клиентских сценариев. |
WML | Используется для устройств, которые понимают WML 1.1. |
Например, если доступ к вашему приложению осуществляет устройство Pocket PC, адаптер HTML генерирует содержимое в формате HTML 3.2. Наборы адаптеров объявляются в разделе <mobileControls>. Ниже приведен синтаксис этого раздела.
<system.web> <mobileControls allowCustomAttributes="true | false" sessionStateHistorySize="size of history" cookielessDataDictionaryType="dictionary type"> <device name="device name" inheritsFrom="parent adapter set" predicateClass="class" predicateMethod="method to call" pageAdapter="Adapter Class"> <control name="control class" adapter="adapter class" /> </device> </mobileControls> </system.web>
В показанной выше записи имеется много свойств и элементов, и мы последовательно рассмотрим все эти элементы.
Работа с устройствами
Раздел <mobileControls> содержит подраздел <device>, в котором объявляется новый адаптер, используемый для мобильных элементов управления. Свойства раздела <device> приведены в табл. 5.3.
name | Определяет имя данного набора адаптера. |
inheritsFrom | Определяет набор адаптера, от которого наследуется этот адаптер. Этот адаптер должен быть объявлен либо ранее в этом же разделе <mobileControls>, либо в разделе <mobileControls> вышестоящего настроечного файла. |
predicateClass | Указывает класс, с помощью которого определяется, должен ли данный адаптер использоваться для текущего запрашивающего устройства. Значение свойства представляет полную ссылку на этот класс. Оно может наследоваться от класса, указанного в свойстве inheritsFrom. |
predicateMethod | Указывает метод .NET, с помощью которого определяется, должен ли данный адаптер использоваться для этого устройства. Этот метод должен быть расположен в классе, указанном в свойстве predicateClass. Значение свойства может наследоваться от класса, указанного в свойстве inheritsFrom. |
pageAdapter | Определяет класс .NET для адаптера страницы данного набора адаптера. Значение свойства представляет полную ссылку на этот класс. Класс адаптера страницы должен реализовать интерфейс IPageAdapter. Это значение может наследоваться от класса, указанного в свойстве inheritsFrom. |
Каждый раздел <device> может содержать несколько подразделов <control>, каждый из которых задает соответствие между элементом управления и адаптером для обработки этого элемента. Каждый элемент управления, настраиваемый для данного устройства, должен иметь обрабатываемый его адаптер. В таблице 5.4 содержится перечень свойств раздела <control>.
name | Определяет имя мобильного элемента управления, для которого определяется адаптер. |
adapter | Определяет адаптер, который будет настраивать этот элемент управления для запрашивающего устройства. |
Чтобы получить лучшее представление о том, как все работает, посмотрите на пример раздела <device>, взятого непосредственно из файла machine.config.
<device name="ChtmlDeviceAdapters" inheritsFrom="HtmlDeviceAdapters" predicateClass="System.Web.UI.MobileControls.Adapters. ChtmlPageAdapter" predicateMethod="DeviceQualifies" pageAdapter= "System.Web.UI.MobileControls.Adapters.ChtmlPageAdapter"> <control name="System.Web.UI.MobileControls.Form" adapter= "System.Web.UI.MobileControls.Adapters.ChtmlFormAdapter" /> <control name="System.Web.UI.MobileControls.Calendar" adapter= "System.Web.UI.MobileControls.Adapters.ChtmlCalendarAdapter"/> <control name="System.Web.UI.MobileControls.Image" adapter= "System.Web.UI.MobileControls.Adapters.ChtmlImageAdapter" /> <! ---Extra control sections removed for brevity --> </device>
В примере раздел <device> предназначен для адаптера ChtmlDeviceAdapters и показывает, как выглядит обычный раздел <device>.
Создание фильтра сравнения
Ниже перечислены шаги, которые следует предпринять для создания фильтра сравнения.
Решите, какую возможность следует проверять. Это может быть любая возможность, доступная через класс mobileCapabilities. В примере проверяется возможность isColor, определяющая наличие в устройстве цветного дисплея.Решите, какое значение следует проверять; в примере проверяется значение true.С помощью информацию, полученной на шаге 1 и 2, создайте новый элемент <filter> и добавьте его в раздел <deviceFilters> файла machine.config или web.config, например, как показано ниже: <deviceFilters> <filter name="IsColorCapable" compare="isColor" argument="true" /> </deviceFilters>
Данный фильтр будет возвращать значение true, если возможность isColor равна true.
Создание набора адаптера данных
Полная процедура создания собственного адаптера выходит за рамки этой книги, но в данном параграфе приведен краткий обзор и некоторые советы по созданию адаптеров. Наилучшим способом создания собственного адаптера является его разработка на основе свободно распространяемого исходного кода Microsoft. Хотя по умолчанию MMIT устанавливается вместе с ASP.NET 1.1, вам все же потребуется скачать и установить MMIT, чтобы получить исходный код адаптера устройства. MMIT находится на сайте http://mdsn.microsoft.com
После установки MMIT папка с исходным кодом адаптера помещается в директорию С:\Program Files\Microsoft Mobile Internet Toolkit. Это исходный код трех различных адаптеров по умолчанию, и он неоценим при создании собственного адаптера для устройства. Используйте данный код как основу для своего кода, а затем измените его в соответствии с требованиями своего устройства.
Сначала создайте адаптер страниц в качестве предикатного класса. Предикатный класс содержит предикатный метод, который определяет, должен ли использоваться ваш адаптер. Ниже приведен фрагмент файла HtmlPageAdapter из папки исходных кодов адаптеров.
C#
public static bool DeviceQualifies(HttpContext context) { String type =((MobileCapabilities)context.Request.Browser). PreferredRenderingType; bool javascriptSupported = context.Request.Browser.JavaScript; bool qualifies = (type == MobileCapabilities.PreferredRenderingTypeHtml32) && javascriptSupported; return qualifies; }
VB.NET
Public Shared Function DeviceQualifies(ByVal context As _ HttpContext) As Boolean Dim type As String = (CType(context.Request.Browser, _ MobileCapabilities)).PreferredRenderingType Dim javascriptSupported As Boolean = _ context.Request.Browser.JavaScript Dim qualifies As Boolean = (type = _ MobileCapabilities.PreferredRenderingTypeHtml32) And _ javascriptSupported Return qualifies End Function
Данная функция возвращает значение типа Boolean, и среда выполнения для мобильных устройств определяет, должен ли этот адаптер обрабатывать запрос. Функция принимает текущий объект контекста HTTP и считывает, может ли это устройство обрабатывать HTML и JavaScript. Если устройство способно обрабатывать HTML и поддерживает JavaScript, то возвращается значение true, и запрос обрабатывается указанным адаптером. Страничный адаптер содержит несколько методов, которые отображают страницу, но здесь их описание не приводится.
После окончания работы над страничным адаптером, в том числе над предикатным методом, создайте адаптеры элементов управления для каждого элемента управления. Простейшим способом является взятие за основу кода, включенного в примеры кода MMIT. Создание собственного набора адаптера – это длинная процедура (ее описание здесь не приводится), но, изучив приведенную информацию и исходные коды, вы сможете создать набор адаптера для своего устройства.
Создание оценочного фильтра
Фильтры оценки при возвращении true или false используют собственный класс. Поскольку вы пишете класс, он может оценивать любое количество свойств или переменных. Первым шагом является создание класса для определения значения, возвращаемого фильтром (true или false), например, как показано ниже.
C#
public bool methodName(System.Web.Mobile.MobileCapabilities mobileCaps, string optionalString) { // Здесь расположена логика класса }
VB.NET
Public Function methodName(mobileCaps as _ System.Web.Mobile.MobileCapabilities, optionalString as String) _ as Boolean 'Здесь расположена логика класса End Function
Данный метод принимает экземпляр класса MobileCapabilities, который позволяет считывать свойства возможностей браузера и определять, должен ли класс возвратить значение true или false. Второй параметр – это строка, с помощью которой передается дополнительная информация, необходимая для использования в классе. Ниже приведены шаги для создания и настройки оценочного фильтра.
Создайте собственный класс для вычисления true или false. Пример оценочного класса показан ниже. Этот класс проверяет возможности браузера isColor и ScreenBitDepth и определяет, может ли запрашивающее устройство работать с многоцветными изображениями.Добавьте фильтр в раздел <deviceFilters>.<deviceFilters> <filter name="IsHighColor" type="ASPNETConfig.MEvaluators, ASPNETConfig.dll" method="IsHighColor" /> </deviceFilters>
Данный фильтр будет возвращать true, если запрашивающее устройство способно работать с многоцветными изображениями.
C#
public bool isHighColor(System.Web.Mobile.MobileCapabilities mobileCaps, string OptionalString) { bool bIsHighColor; if(mobileCaps.IsColor == true && mobileCaps.ScreenBitDepth >= 16) { bIsHighColor = true; } else { bIsHighColor = false; } return bIsHighColor; }
VB.NET
Public Function isHighColor(mobileCaps As _ System.Web.Mobile.MobileCapabilities, OptionalString As String) _ As Boolean Dim bIsHighColor As Boolean If mobileCaps.IsColor = True And _ mobileCaps.ScreenBitDepth >= 16 Then bIsHighColor = True Else bIsHighColor = False End If Return bIsHighColor End Function