В
этой лекции более подробно рассмотрены
параметры для настройки Microsoft Mobile
Internet Toolkit (MMIT – набор элементов
управления Microsoft для мобильных
устройств), включенного в Microsoft .NET
Framework версии 1.1. MMIT – это
коллекция пространств имен и элементов
управления, которые используются при
разработке приложений для мобильных
устройств. Для определения типа
устройства, производящего доступ к
ресурсу, MMIT использует раздел
<browserCaps>
совместно с разделами
<mobileControls>
и <deviceFilters>.
После определения типа и возможностей
этого устройства MMIT соответствующим
образом настраивает содержимое,
отсылаемое клиенту.
Ниже
приведено описание следующих разделов.
-
<mobileControls>.
Позволяет определить новые адаптеры
устройств, которые ставятся в
соответствие мобильным элементам
управления ASP.NET.
-
<deviceFilters>.
Позволяет добавлять фильтры
устройств, используемых в коде, для
ручной настройки содержимого страниц,
отсылаемого клиенту.
Определение мобильного устройства в
разделе <browserCaps>
является простейшим способом указать его
параметры.
Дополнительная
информация. Имеются различные
типы устройств, которые считаются "мобильными":
телефоны, карманные компьютеры
(PDA), пейджеры и любые другие
устройства, которые не используют
полноценный браузер (Internet
Explorer, Netscape и т.п.)
Если
вам требуются дополнительные возможности
по настройке, отсутствующие в разделе
<browserCaps>,
воспользуйтесь настройкой отсылаемого
клиенту содержимого в разделах
<mobileControls>
и <deviceFilters>.
Работа
с разделом <mobileControls>
Раздел
<mobileControls>
определяет набор адаптеров,
соответствующих мобильным элементам
управления ASP.NET. Адаптер – это класс,
который настраивает каждый мобильный
элемент управления для конкретного
мобильного устройства или языка. В
таблице 5.1 содержится перечень
адаптеров, установленных в MMIT по
умолчанию.
Таблица 5.1. Набор мобильных
адаптеров по умолчанию
Адаптер |
Описание |
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>
Свойства элемента
<mobileControls> – это глобальные
параметры среды выполнения для мобильных
устройств. Они позволяют настраивать то,
как среда мобильных устройств
поддерживает состояние и включены ли
пользовательские атрибуты. В таблице 5.2
содержится перечень свойств элемента
<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
и использует это свойство для генерации
собственного содержимого для клиента.
Работа
с устройствами
Раздел
<mobileControls>
содержит подраздел
<device>,
в котором объявляется новый адаптер,
используемый для мобильных элементов
управления. Свойства раздела
<device>
приведены в табл. 5.3.
Таблица 5.3. Свойства <device>
Свойство |
Описание |
name |
Определяет
имя данного набора адаптера. |
inheritsFrom |
Определяет
набор адаптера, от которого
наследуется этот адаптер.
Этот адаптер должен быть
объявлен либо ранее в этом
же разделе
<mobileControls>,
либо в разделе
<mobileControls>
вышестоящего настроечного
файла. |
predicateClass |
Указывает
класс, с помощью которого
определяется, должен ли
данный адаптер
использоваться для текущего
запрашивающего устройства.
Значение свойства
представляет полную ссылку
на этот класс. Оно может
наследоваться от класса,
указанного в свойстве
inheritsFrom. |
predicateMethod |
Указывает
метод .NET, с помощью
которого определяется,
должен ли данный адаптер
использоваться для этого
устройства. Этот метод
должен быть расположен в
классе, указанном в свойстве
predicateClass.
Значение свойства может
наследоваться от класса,
указанного в свойстве
inheritsFrom. |
pageAdapter |
Определяет
класс .NET для адаптера
страницы данного набора
адаптера. Значение свойства
представляет полную ссылку
на этот класс. Класс
адаптера страницы должен
реализовать интерфейс
IPageAdapter. Это
значение может наследоваться
от класса, указанного в
свойстве
inheritsFrom. |
Каждый
раздел <device>
может содержать несколько подразделов
<control>,
каждый из которых задает соответствие
между элементом управления и адаптером
для обработки этого элемента. Каждый
элемент управления, настраиваемый для
данного устройства, должен иметь
обрабатываемый его адаптер. В таблице
5.4 содержится перечень свойств раздела
<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>.
Создание набора адаптера данных
Полная
процедура создания собственного адаптера
выходит за рамки этой книги, но в данном
параграфе приведен краткий обзор и
некоторые советы по созданию адаптеров.
Наилучшим способом создания собственного
адаптера является его разработка на
основе свободно распространяемого
исходного кода 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. Создание собственного
набора адаптера – это длинная процедура
(ее описание здесь не приводится), но,
изучив приведенную информацию и исходные
коды, вы сможете создать набор адаптера
для своего устройства.
Работа
с разделом <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.
Таблица 5.5. Свойства <filter>
Свойство |
Описание |
name |
Определяет
уникальное имя фильтра. Это
имя используется для вызова
фильтра в коде. Если вы
укажете имя существующего
фильтра, оно будет
переопределено. |
compare |
Определяет
имя возможности, которую
нужно проверить, – это любая
из возможностей, включенных
в класс
mobileCapabilities
или добавленная собственная
возможность. Свойство
используется при создании
фильтров сравнения. |
argument |
Определяет
аргумент, используемый при
сравнении с возможностью,
указанной в свойстве
compare. Свойство
используется при создании
фильтров сравнения. |
type |
Определяет
класс, предоставляющий
оценочный метод. Значение
свойства должно
соответствовать стандартам
.NET по полному указанию
класса. Свойство
используется при создании
оценочных фильтров. |
method |
Определяет
метод, с помощью которого
определяется значение,
возвращаемое фильтром (true
или
false). Свойство
используется при создании
оценочных фильтров. |
Создание фильтра сравнения
Ниже
перечислены шаги, которые следует
предпринять для создания фильтра
сравнения.
-
Решите, какую возможность следует
проверять. Это может быть любая
возможность, доступная через класс
mobileCapabilities. В примере
проверяется возможность
isColor,
определяющая наличие в устройстве
цветного дисплея.
-
Решите, какое значение следует
проверять; в примере проверяется
значение true.
- С
помощью информацию, полученной на
шаге 1 и 2, создайте новый элемент
<filter>
и добавьте его в раздел
<deviceFilters>
файла
machine.config или
web.config,
например, как показано ниже:
<deviceFilters>
<filter name="IsColorCapable" compare="isColor"
argument="true" />
</deviceFilters>
Данный
фильтр будет возвращать значение
true, если
возможность
isColor равна
true.
Создание оценочного фильтра
Фильтры оценки при возвращении
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
Использование фильтров для мобильных
элементов управления
Теперь
давайте рассмотрим, как использовать
фильтры для настройки содержимого,
генерируемого мобильными элементами
управления. Оба описанных фильтра
предназначены для определения цветовых
возможностей запрашивающего устройства,
так что вполне естественно, если мы
рассмотрим их применение для элемента
управления <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.
Подобное использование фильтров
позволяет настраивать свойства элемента
управления, основываясь на любом
количестве возможностей браузера или
другом критерии.
Обновление устройств мобильных элементов
управления
Наиболее важной частью настройки
приложений для мобильных устройств
является обеспечение гарантии того, что
вы сможете обнаружить и правильно
определить возможности большого
количества различных мобильных устройств.
По умолчанию ASP.NET обнаруживает
множество устройств, но, как вы знаете,
каждый день их количество растет.
Поэтому Microsoft периодически выпускает
Mobile Controls Device Updates
(Обновления мобильных устройств для
элементов управления). Эти обновления
включают обновления для следующих
разделов.
-
Настроечные параметры
<browserCaps>.
-
Настроечные параметры
<mobileControls>.
-
Сборки адаптеров.
-
Настроечные параметры
<assemblies>.
Было
опубликовано два таких обновления, но
поскольку они кумулятивны, то
потребуется установить самый последний.
Одной из функций, включенных в доступное
на момент написания книги обновление
устройств, является новый адаптер XHTML.
Этот адаптер генерирует для мобильных
устройств с поддержкой XHTML содержимое,
совместимое с XHTML. В будущем можно
ожидать появления других обновлений,
включая определение новых браузеров,
новые адаптеры и прочее. Чтобы скачать
наиболее свежее обновление браузера,
проверьте веб-страницу новых выпусков
http://msdn.microsoft.com/vstudio/device/mobilecontrols/aspmobiledrivers.asp.
Ключевые моменты
- В
разделе <mobileControls>
объявляются и настраиваются адаптеры,
используемые при генерации
содержимого для конкретных форматов,
включая HTML, CHTML и WML.
-
Использование в качестве основы
примеров кода, доступных в MMIT,
облегчает создание собственных
адаптеров для новых мобильных
устройств.
- В
разделе <deviceFilters>
можно создать фильтры для проверки
возможностей браузера, возвращающих
либо значение
true, либо значение
false.
-
Элемент <DeviceSpecific>
позволяет настроить вывод отдельного
мобильного элемента управления с
помощью фильтров, определенных в
разделе <deviceFilters>.
-
Microsoft периодически выпускает
обновления устройств, использующих
мобильные элементы управления, с
модификацией кода определения
браузера, новых адаптеров и других
настроечных параметров,
предназначенных для работы с
мобильными устройствами.
|