Автор: Dflying Chen ( http://dflying.cnblogs.com/ )
После понимания основных концепций и выполнения предварительных условий (см.: Разработка элемента управления серверного расширения ASP.NET Atlas — основные понятия и предварительные требования) мы можем приступить к разработке этого ValidateUserNameExtender.
Сначала создайте новый проект управления Atlas в Visual Studio и назовите его ValidateUserName. После создания решение должно выглядеть следующим образом:
Как видите, в шаблоне проекта автоматически упоминается следующая сборка:
Microsoft.Web.Atlas.dll, которая является основной сборкой Atlas и будет использоваться следующей сборкой Microsoft.AtlasControlExtender.dll.
Microsoft.AtlasControlExtender.dll — это сборка, в которой находится базовый класс Extender в Atlas, предоставленный Microsoft. Несколько необходимых классов в нашем настроенном Extender наследуются от базового класса, представленного в этой сборке.
В то же время этот шаблон проекта также создал для нас файл JavaScript и три файла C#:
ValidateUserNameBehavior.js, который является основной частью нашего расширителя, а также файлом, вмещающим все клиентские сценарии. Содержимое будет в основном. так же, как при использовании ASP.NET Atlas разрабатывает содержимое файла ValidateUserNameBehavior.js в пользовательском поведении для проверки в реальном времени, зарегистрировано ли имя пользователя, что будет подробно проанализировано позже. Atlas' Extender на самом деле является инкапсуляцией этого поведения на стороне клиента, что делает его элементом управления на стороне сервера, упрощающим работу разработчиков программ веб-сайтов при его использовании. Как разработчику элементов управления это добавляет много работы.
ValidateUserNameDesigner.cs, используемый здесь для написания кода, обеспечивающего поддержку времени разработки в Visual Studio.
ValidateUserNameExtender.cs, используемый здесь для определения нашего расширителя.
ValidateUserNameProperties.cs используется для определения свойств, используемых в нашем расширителе. Значения этих свойств будут сопоставлены со свойствами поведения клиента.
Начнем с файла JavaScript ValidateUserNameBehavior.js. Откройте файл ValidateUserNameBehavior.js. Мы обнаружим, что шаблон добавил для нас 77 строк кода, а в коде есть еще 3. Шаг первый:
создайте локальные переменные для хранения значений атрибутов.
Добавьте эти локальные переменные в дескриптор типа. Этот шаг позволит Atlas понять ваш класс.
Добавьте средства доступа (геттеры и сеттеры) к локальным переменным.
Прежде чем приступить к шагу 1, мы сначала меняем пространство имен по умолчанию в шаблоне на то, что нам нужно. Здесь я использую Dflying.Atlas.ControlTookit.ValidateUserName и обновляю все связанные имена классов, которые появляются в коде.
Затем для шага 1 и шага 3 мы делаем это вместе. Обратитесь к ValidateUserNameBehavior.js в пользовательском поведении, которое использует ASP.NET Atlas для разработки проверки в реальном времени того, зарегистрировано ли имя пользователя, CheckResultLabelID, ServiceName, MethodName, ValidMessage и. Следует добавить атрибуты InvalidMessage, здесь я привожу только пример:
var _MethodName;
this.get_MethodName = function() {
вернуть _ИмяМетода;
}
this.set_MethodName = функция (значение) {
если (_MethodName != значение) {
_ИмяМетода = значение;
this.raisePropertyChanged('ИмяМетода');
}
}
Затем шаг 2: this.getDescriptor = function() {
var td = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'getDescriptor');
td.addProperty('CheckResultLabelID', String);
td.addProperty('ServiceName', String);
td.addProperty('ИмяМетода', String);
td.addProperty('ValidMessage', String);
td.addProperty('InvalidMessage', String);
вернуть тд;
}
Наконец, есть конструктор и функция анализа, которые также присутствуют в TODO:
this.initialize = function() {
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'initialize');
_blurHandler = Function.createDelegate(this, BlurHandler);
this.control.element.attachEvent('onblur', _blurHandler);
}
this.dispose = функция() {
если (_blurHandler) {
this.control.element.detachEvent('onblur', _blurHandler);
_blurHandler = ноль;
}
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'dispose');
}
Плюс обработчик, вызывающий веб-службу, и соответствующий обратный вызов:
this.initialize = function() {
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'initialize');
_blurHandler = Function.createDelegate(this, BlurHandler);
this.control.element.attachEvent('onblur', _blurHandler);
}
this.dispose = функция() {
если (_blurHandler) {
this.control.element.detachEvent('onblur', _blurHandler);
_blurHandler = ноль;
}
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'dispose');
}
Также есть часть Кода, автоматически генерируемая Шаблоном, которая используется для подключения статусного взаимодействия между сервером и клиентом. В этом примере нам не нужно ее использовать. Конечно, нет никакого вреда в ее сохранении:
this.getClientState = функция() {
значение var = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'get_ClientState');
если (значение == '') значение = ноль;
возвращаемое значение;
}
this.setClientState = функция (значение) {
return Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'set_ClientState',[value]);
}
Последнее, на что следует обратить внимание, это последняя строка этого JavaScript:
Sys.TypeDescriptor.addType('dflying', 'ValidateUserNameBehavior', Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior);
Среди них dflying представляет собой префикс объявления клиентского элемента управления, созданного нашим расширителем, а ValidateUserNameBehavior представляет имя тега клиентского элемента управления. Эти два имени следует выбрать и запомнить, и они также будут использоваться в следующих файлах CS.
Таким образом, полный исходный код ValidateUserNameBehavior.js выглядит следующим образом:
ValidateUserNameBehavior.js.
// (c) Авторские права принадлежат корпорации Microsoft.
// На этот источник распространяется действие Разрешительной лицензии Microsoft.
// См.http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx .
// Все остальные права защищены.
Type.registerNamespace('Dflying.Atlas.ControlTookit.ValidateUserName');
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior = function() {
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.initializeBase(this);
вар _blurHandler;
вар _CheckResultLabelID;
вар _checkResultLabel;
var_ServiceName;
var_MethodName;
var _ValidMessage = "Вы можете использовать это имя пользователя.";
var _InvalidMessage = "Это имя пользователя уже использовалось, выберите другое.";
this.get_CheckResultLabelID = function() {
вернуть _CheckResultLabelID;
}
this.set_CheckResultLabelID = функция (значение) {
if (_CheckResultLabelID != значение) {
_checkResultLabel = $(значение);
debug.assert(_checkResultLabel != null, «CheckResultLabelID должен быть установлен на действительный элемент DOM.»);
_CheckResultLabelID = значение;
this.raisePropertyChanged('CheckResultLabelID');
}
}
this.get_ServiceName = функция() {
вернуть _ServiceName;
}
this.set_ServiceName = функция (значение) {
if (_ServiceName != значение) {
_ServiceName = значение;
this.raisePropertyChanged('ServiceName');
}
}
this.get_MethodName = функция() {
вернуть _ИмяМетода;
}
this.set_MethodName = функция (значение) {
если (_MethodName != значение) {
_ИмяМетода = значение;
this.raisePropertyChanged('ИмяМетода');
}
}
this.get_ValidMessage = функция() {
вернуть _ValidMessage;
}
this.set_ValidMessage = функция (значение) {
если (_ValidMessage != значение) {
_ValidMessage = значение;
this.raisePropertyChanged('ValidMessage');
}
}
this.get_InvalidMessage = функция() {
вернуть _InvalidMessage;
}
this.set_InvalidMessage = функция (значение) {
если (_InvalidMessage != значение) {
_InvalidMessage = значение;
this.raisePropertyChanged('InvalidMessage');
}
}
this.initialize = функция() {
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'initialize');
_blurHandler = Function.createDelegate(this, BlurHandler);
this.control.element.attachEvent('onblur', _blurHandler);
}
this.dispose = функция() {
если (_blurHandler) {
this.control.element.detachEvent('onblur', _blurHandler);
_blurHandler = ноль;
}
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'dispose');
}
this.getDescriptor = функция() {
var td = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'getDescriptor');
td.addProperty('CheckResultLabelID', String);
td.addProperty('ServiceName', String);
td.addProperty('ИмяМетода', String);
td.addProperty('ValidMessage', String);
td.addProperty('InvalidMessage', String);
вернуть тд;
}
функция BlurHandler() {
if (this.control.element.value == '') {
_checkResultLabel.innerHTML = '';
возвращаться;
}
Sys.Net.ServiceMethod.invoke(
_ИмяСервиса,
_ИмяМетода,
'',
{userNameCandidate: this.control.element.value},
_onMethodComplete
);
}
функция _onMethodComplete (результат)
{
_checkResultLabel.innerHTML = результат? _ValidMessage: _InvalidMessage;
}
this.getClientState = функция() {
значение var = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'get_ClientState');
если (значение == '') значение = ноль;
возвращаемое значение;
}
this.setClientState = функция (значение) {
return Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'set_ClientState',[value]);
}
}
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.registerSealedClass('Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior', Microsoft.AtlasControlExtender.BehaviorBase);
Sys.TypeDescriptor.addType('dflying', 'ValidateUserNameBehavior', Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior
На данный момент клиентская часть завершена, за ней следует серверная часть, то есть оставшиеся три Подготовка CS
);файлы.