Autor: Dflying Chen ( http://dflying.cnblogs.com/ )
Nachdem wir die Grundkonzepte verstanden und die Voraussetzungen erfüllt haben (siehe: Entwickeln der serverseitigen Extender-Steuerung von ASP.NET Atlas – Grundkonzepte und Voraussetzungen), können wir mit der Entwicklung dieses ValidateUserNameExtender beginnen.
Erstellen Sie zunächst ein neues Atlas Control-Projekt in Visual Studio und nennen Sie es „ValidateUserName“. Nach der Erstellung sollte die Lösung wie im folgenden Bild aussehen:
Wie Sie sehen können, wird für uns in der Projektvorlage automatisch auf die folgende Assembly verwiesen:
Microsoft.Web.Atlas.dll, die Kernassembly von Atlas, die von der folgenden Microsoft.AtlasControlExtender.dll verwendet wird.
Microsoft.AtlasControlExtender.dll, dies ist die Assembly, in der sich die Basisklasse des von Microsoft bereitgestellten Extenders in Atlas befindet. Mehrere notwendige Klassen in unserem angepassten Extender erben von der in dieser Assembly bereitgestellten Basisklasse.
Gleichzeitig hat diese Projektvorlage auch eine JavaScript-Datei und drei C#-Dateien für uns erstellt:
ValidateUserNameBehavior.js, die den Kernbestandteil unseres Extenders darstellt und auch die Datei ist, die alle clientseitigen Skripte enthält Genauso wie bei der Verwendung von ASP.NET entwickelt Atlas den Inhalt der Datei ValidateUserNameBehavior.js im benutzerdefinierten Verhalten, um in Echtzeit zu überprüfen, ob der Benutzername registriert ist, was später im Detail analysiert wird. Der Extender von Atlas ist eigentlich eine Kapselung dieses clientseitigen Verhaltens und macht ihn zu einer serverseitigen Steuerung, um die Arbeit von Website-Programmentwicklern bei der Verwendung zu vereinfachen. Als Steuerungsentwickler kommt dadurch eine Menge Arbeit hinzu.
ValidateUserNameDesigner.cs wird hier zum Schreiben von Code verwendet, der Entwurfszeitunterstützung in Visual Studio bereitstellt.
ValidateUserNameExtender.cs, hier verwendet, um unseren Extender zu definieren.
ValidateUserNameProperties.cs wird verwendet, um die in unserem Extender verwendeten Eigenschaften zu definieren. Die Werte dieser Eigenschaften werden den Eigenschaften des Client-Verhaltens zugeordnet.
Beginnen wir mit der JavaScript-Datei ValidateUserNameBehavior.js. Wir werden feststellen, dass Template 77 Codezeilen für uns hinzugefügt hat, und der Code enthält 3 weitere Der Code. Schritt eins:
Erstellen Sie lokale Variablen zum Speichern von Attributwerten.
Fügen Sie diese lokalen Variablen zum Typdeskriptor hinzu. Dieser Schritt dient dazu, dass Atlas Ihre Klasse versteht.
Fügen Sie Zugriffsmethoden (Getter und Setter) zu lokalen Variablen hinzu.
Bevor wir mit Schritt 1 beginnen, ändern wir zunächst den Standard-Namespace in der Vorlage auf den von uns benötigten Namen. Hier verwende ich Dflying.Atlas.ControlTookit.ValidateUserName und aktualisiere alle zugehörigen Klassennamen, die im Code erscheinen.
Dann machen wir es für Schritt 1 und Schritt 3 gemeinsam mit ValidateUserNameBehavior.js im benutzerdefinierten Verhalten, das ASP.NET Atlas verwendet, um eine Echtzeitüberprüfung zu entwickeln, ob der Benutzername, CheckResultLabelID, ServiceName, ValidMessage registriert ist Es sollten InvalidMessage-Attribute hinzugefügt werden, hier gebe ich nur ein Beispiel:
var _MethodName
= function() {
return _MethodName;
}
this.set_MethodName = Funktion(Wert) {
if (_MethodName != value) {
_MethodName = Wert;
this.raisePropertyChanged('MethodName');
}
}
Dann Schritt 2: this.getDescriptor = function() {
var td = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'getDescriptor');
td.addProperty('CheckResultLabelID', String);
td.addProperty('ServiceName', String);
td.addProperty('MethodName', String);
td.addProperty('ValidMessage', String);
td.addProperty('InvalidMessage', String);
return td;
}
Schließlich gibt es noch den Konstruktor und die Analysefunktion, die auch in TODO vorkommen:
this.initialize = function() {
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'initialize');
_blurHandler = Function.createDelegate(this, blurHandler);
this.control.element.attachEvent('onblur', _blurHandler);
}
this.dispose = function() {
if (_blurHandler) {
this.control.element.detachEvent('onblur', _blurHandler);
_blurHandler = null;
}
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'dispose');
}
Plus den Handler, der den Webdienst aufruft, und den entsprechenden CallBack:
this.initialize = function() {
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'initialize');
_blurHandler = Function.createDelegate(this, blurHandler);
this.control.element.attachEvent('onblur', _blurHandler);
}
this.dispose = function() {
if (_blurHandler) {
this.control.element.detachEvent('onblur', _blurHandler);
_blurHandler = null;
}
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'dispose');
}
Es gibt auch einen Teil des von Template automatisch generierten Codes, der zur Verbindung der Statusinteraktion zwischen dem Server und dem Client verwendet wird. In diesem Beispiel müssen wir ihn natürlich nicht verwenden:
this.getClientState = function() {
var value = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'get_ClientState');
if (value == '') value = null;
Rückgabewert;
}
this.setClientState = Funktion(Wert) {
return Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'set_ClientState',[value]);
}
Als letztes ist die letzte Zeile dieses JavaScripts zu beachten:
Sys.TypeDescriptor.addType('dflying', 'ValidateUserNameBehavior', Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior);
Unter diesen stellt dflying das Präfix der von unserem Extender generierten Client-Steuerelementdeklaration dar, und ValidateUserNameBehavior stellt den Tag-Namen des Client-Steuerelements dar. Diese beiden Namen sollten ausgewählt und gespeichert werden und werden auch in den folgenden CS-Dateien verwendet.
Auf diese Weise lautet der vollständige Quellcode von ValidateUserNameBehavior.js wie folgt:
ValidateUserNameBehavior.js
// (c) Copyright Microsoft Corporation.
// Diese Quelle unterliegt der Microsoft Permissive License.
// Siehehttp://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx .
// Alle anderen Rechte vorbehalten.
Type.registerNamespace('Dflying.Atlas.ControlTookit.ValidateUserName');
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior = function() {
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.initializeBase(this);
var _blurHandler;
var _CheckResultLabelID;
var _checkResultLabel;
var_ServiceName;
var_MethodName;
var _ValidMessage = „Sie können diesen Benutzernamen verwenden.“;
var _InvalidMessage = „Dieser Benutzername wurde bereits verwendet, bitte wählen Sie einen anderen.“;
this.get_CheckResultLabelID = function() {
return _CheckResultLabelID;
}
this.set_CheckResultLabelID = Funktion(Wert) {
if (_CheckResultLabelID != value) {
_checkResultLabel = $(value);
debug.assert(_checkResultLabel != null, „CheckResultLabelID muss auf ein gültiges DOM-Element gesetzt werden.“);
_CheckResultLabelID = Wert;
this.raisePropertyChanged('CheckResultLabelID');
}
}
this.get_ServiceName = function() {
return _ServiceName;
}
this.set_ServiceName = Funktion(Wert) {
if (_ServiceName != value) {
_ServiceName = Wert;
this.raisePropertyChanged('ServiceName');
}
}
this.get_MethodName = function() {
return _MethodName;
}
this.set_MethodName = Funktion(Wert) {
if (_MethodName != value) {
_MethodName = Wert;
this.raisePropertyChanged('MethodName');
}
}
this.get_ValidMessage = function() {
return _ValidMessage;
}
this.set_ValidMessage = Funktion(Wert) {
if (_ValidMessage != value) {
_ValidMessage = Wert;
this.raisePropertyChanged('ValidMessage');
}
}
this.get_InvalidMessage = function() {
return _InvalidMessage;
}
this.set_InvalidMessage = Funktion(Wert) {
if (_InvalidMessage != value) {
_InvalidMessage = Wert;
this.raisePropertyChanged('InvalidMessage');
}
}
this.initialize = function() {
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'initialize');
_blurHandler = Function.createDelegate(this, blurHandler);
this.control.element.attachEvent('onblur', _blurHandler);
}
this.dispose = function() {
if (_blurHandler) {
this.control.element.detachEvent('onblur', _blurHandler);
_blurHandler = null;
}
Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'dispose');
}
this.getDescriptor = function() {
var td = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'getDescriptor');
td.addProperty('CheckResultLabelID', String);
td.addProperty('ServiceName', String);
td.addProperty('MethodName', String);
td.addProperty('ValidMessage', String);
td.addProperty('InvalidMessage', String);
return td;
}
Funktion BlurHandler() {
if (this.control.element.value == '') {
_checkResultLabel.innerHTML = '';
zurückkehren;
}
Sys.Net.ServiceMethod.invoke(
_ServiceName,
_MethodName,
'',
{ userNameCandidate: this.control.element.value},
_onMethodComplete
);
}
Funktion _onMethodComplete(Ergebnis)
{
_checkResultLabel.innerHTML = result ? _ValidMessage : _InvalidMessage;
}
this.getClientState = function() {
var value = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'get_ClientState');
if (value == '') value = null;
Rückgabewert;
}
this.setClientState = Funktion(Wert) {
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);
Zu diesem Zeitpunkt ist der Client-Teil abgeschlossen, gefolgt von der Serverseite, bei der es sich um die verbleibenden drei CS-Vorbereitungen handelt Dateien.