Funzionalità client in un controllo server
Nella programmazione Web, le funzionalità del client sono in genere compito dello sviluppatore di pagine Web e non vengono incapsulate nei componenti del server. ASP.NET si distacca da questo modello e consente ai controlli server di generare script client in modo da combinare l'elaborazione lato client con quella lato server.
Il caso più semplice di funzionalità client si ha quando un controllo server Web esegue il rendering di un gestore eventi per un evento del client tramite la proprietà Attributes del controllo. Nell'esempio che segue viene illustrato un controllo (ClientClickButton
) che deriva dal controllo server Web System.Web.UI.WebControls.Button e fornisce un gestore eventi per l'evento Click del client.
Nota Uno sviluppatore di pagine può facilmente creare gestori eventi del client tramite l'insieme Attributes del controllo server Web. Lo scopo dell'esempio è quello di mostrare come un controllo può incapsulare tali funzionalità. Per generare questo esempio, vedere le istruzioni riportate in Esempi di controlli server.
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace CustomControls
{
public class ClientClickButton : Button
{
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
writer.AddAttribute("onclick", "alert('Thanks');");
}
}
}
[Visual Basic]
Option Explicit
Option Strict
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Namespace CustomControls
Public Class ClientClickButton
Inherits Button
Protected Overrides Sub AddAttributesToRender(writer As HtmlTextWriter)
MyBase.AddAttributesToRender(writer)
writer.AddAttribute("onClick", "alert('Thanks');")
End Sub
End Class
End Namespace
Nella pagina seguente viene utilizzato il controllo personalizzato ClientClickButton
. Per verificare che nel client venga eseguito il rendering dell'attributo onClick
su ClientClickButton
, richiedere la pagina nel browser e visualizzare l'origine.
<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
<html>
<body>
<form runat=server>
This button handles a client-side click event.
<Custom:ClientClickButton Id = "Button" BackColor = "Red" runat=server/> <br> <br>
</form>
</body>
</html>
L'esempio precedente costituisce una descrizione molto semplice di funzionalità client. ASP.NET consente a un controllo di partecipare a scenari client più complessi, quali quelli nel seguente elenco:
- Mettere a disposizione una libreria di script client.
- Generare script nella parte superiore o inferiore di una pagina.
- Assicurare che un blocco di script appaia solo una volta in una pagina, anche se in quella pagina vi sono più istanze del controllo.
- Consentire a un controllo di associare un gestore eventi all'evento di inserimento del form dal lato client, se la pagina include un form.
- Aggiungere l'elemento client di cui un controllo ha eseguito il rendering a una variabile di matrice dichiarata nel client.
Questi scenari vengono attivati tramite i metodi esposti dalla classe System.Web.UI.Page e sono accessibili a un controllo server ASP.NET tramite la proprietà Page. Nella tabella seguente sono elencati i metodi della classe Page che mettono a disposizione funzionalità client.
Metodo | Descrizione | Utilizzo |
---|---|---|
Page.RegisterClientScriptBlock | Consente a un controllo di generare un blocco di script, che contiene codice script nella stessa riga o specifica il percorso di un file script. Il blocco di script viene sottoposto a rendering nella parte superiore della pagina e viene registrato, mediante una chiave, con la pagina, in modo da essere generato una sola volta, anche se la pagina contiene più istanze del controllo.
Nota In una pagina ASP.NET, un blocco di script generato nella parte superiore della pagina viene denominato blocco di script del client. |
Quando si desidera includere una libreria di script o eseguire il rendering di un blocco di script contenente funzioni generali, richiamate successivamente nella pagina. In particolare, le funzioni richiamate durante la fase di rendering devono trovarsi nella parte superiore della pagina. |
Page.RegisterStartupScript | Consente a un controllo di generare un blocco di script, che contiene codice script nella stessa riga o specifica il percorso di un file script. Il blocco di script viene sottoposto a rendering nella parte inferiore della pagina e viene registrato, mediante una chiave, con la pagina, in modo da essere generato una sola volta, anche se la pagina contiene più istanze del controllo.
Nota In una pagina ASP.NET, un blocco di script generato nella parte inferiore della pagina viene detto blocco di script di avvio. |
Quando si desidera generare uno script che richiami elementi contenuti nella pagina o uno script che deve essere eseguito all'avvio. Poiché questo script viene generato nella parte inferiore della pagina, gli elementi a cui fa riferimento sono sicuramente esistenti prima dell'esecuzione dello script. |
Page.RegisterArrayDeclaration | Consente a un controllo di aggiungersi a una variabile di matrice del client con un nome specificato. Il nome della variabile viene registrato, tramite una chiave, con la pagina contenitore, in modo tale che nello script del client visualizzato nella pagina venga eseguito il rendering di una sola matrice con quel nome. | Quando si desidera che l'elemento di cui il controllo esegue il rendering appartenga a una variabile di matrice nello script del client. La matrice consente di raggruppare elementi dello stesso tipo per facilitare l'accesso allo script del client. Ad esempio, i controlli di convalida si aggiungono a una matrice denominata Page_Validators. |
Page.RegisterOnSubmitStatement | Associa un gestore eventi all'evento di inserimento del form dal lato client e lo registra, mediante una chiave, con la pagina contenitore. Il gestore viene sottoposto a rendering come attributo onSubmit dell'elemento del form. La registrazione del gestore assicura che più istanze del controllo non generino più di un gestore. | Quando si desidera richiamare un gestore del client al momento dell'inserimento del form.
Nota È possibile passare il codice script nella stessa riga a questo metodo direttamente come argomento oppure passare la chiamata a un gestore eventi. Se la chiamata viene passata a un gestore eventi, questo deve essere definito in modo indipendente in un blocco di script o in una libreria di script. |
Page.IsClientScriptBlockRegistered | Determina se un blocco di script del client con la chiave specificata è stato registrato con la pagina contenitore. | Utilizzare il valore restituito da questo metodo per determinare se è necessario chiamare Page.RegisterClientScriptBlock. |
Page.IsStartupScriptRegistered | Determina se un blocco di script di avvio con la chiave specificata è stato registrato con la pagina contenitore. | Utilizzare il valore restituito da questo metodo per determinare se è necessario chiamare Page.RegisterStartupScript. |
Page.RegisterHiddenField | Consente a un controllo server di registrare un campo nascosto nella pagina contenitore emesso durante il rendering della pagina. Gli script client possono accedere a questo campo. Quando il form è rinviato al server, il campo nascosto è a disposizione di quest'ultimo sotto forma di dati di postback. | Quando un controllo server deve inviare una variabile nascosta a cui è possibile accedere nello script del client. Questo è utile quando non è possibile eseguire il rendering della variabile come attributo del controllo o quando l'elaborazione da parte del client richiede una variabile indipendente dal controllo. Per un esempio, vedere Persistenza delle modifiche del client in un controllo non di form. |
I controlli di convalida sono gli unici controlli server ASP.NET che sfruttano appieno le funzioni client fornite da quest'ultimo. Poiché il DOM supportato dai diversi browser non è uniforme, la maggior parte dei controlli server forniti con .NET Framework SDK riduce al minimo l'uso di script client, utilizzandoli al massimo per il postback automatico. Per informazioni dettagliate sull'utilizzo di script per il postback, vedere Generazione di script lato client per il postback. Tuttavia, se si utilizza un browser specifico o browser di destinazione che supporta un determinato DOM, è possibile utilizzare script client nei controlli, per ottimizzare le prestazioni del client e limitare, quando possibile, i percorsi di andata/ritorno al server.
Utilizzo dei metodi di script esposti dalla classe Page
Nel seguente frammento di codice tratto da Esempio di controllo di convalida base vengono utilizzati numerosi metodi di script del lato client esposti dalla classe Page. Nel frammento le chiamate dei metodi di script del client sono in grassetto. Il codice iniziale del frammento definisce costanti di stringa che contengono il nome del file di script da includere nella parte superiore della pagina, una chiave per la registrazione del blocco di script con la pagina, un blocco di script da includere nella parte inferiore della pagina e una stringa con informazioni sulla formattazione.
private const string ValidatorFileName = "DomValidation.js";
// The key to register a script key. In this example, the same key
// is used for registering both the script at the top of the
// page (called the client-side script block) and the script
// that is rendered at the bottom of the page (called startup
// script).
private const string ValidatorIncludeScriptKey = "DomValidatorIncludeScript";
// The script block that is rendered at the bottom of the page.
private const string ValidatorStartupScript = @"
<script language=""javascript"">
<!--
var Page_ValidationActive = false;
if (typeof(Page_DomValidationVer) == ""undefined"")
alert(""{0}"");
else
ValidatorOnLoad();
function ValidatorOnSubmit() {{
if (Page_ValidationActive) {{
return ValidatorCommonOnSubmit();
}}
}}
// -->
</script>
";
// Provides formatting information for emitting the script
// block at the top of the page.
private const string IncludeScriptFormat = @"
<script language=""{0}"" src=""{1}{2}""></script>";
// This method is called from OnPrerender in the
// Base Validator Control Sample.
protected void RegisterValidatorCommonScript() {
string location = null;
if (!Page.IsClientScriptBlockRegistered(ValidatorIncludeScriptKey)) {
// Provide the location of the script file.
location = Page.Request.ApplicationPath + "/script/";
// Create client script block.
string includeScript = String.Format(IncludeScriptFormat, "javascript", location, ValidatorFileName);
Page.RegisterClientScriptBlock(ValidatorIncludeScriptKey, includeScript);
}
if (!Page.IsStartupScriptRegistered(ValidatorIncludeScriptKey)) {
if (location == null) location = Page.Request.ApplicationPath + "/script/";
// Provide error message, which is localized.
string missingScriptMessage = "Validation script is missing '" + location + ValidatorFileName + "'";
// Create startup script block.
string startupScript = String.Format(ValidatorStartupScript, new object [] {missingScriptMessage,});
Page.RegisterStartupScript(ValidatorIncludeScriptKey, startupScript);
}
Page.RegisterOnSubmitStatement("ValidatorOnSubmit", "return ValidatorOnSubmit();");
}
[Visual Basic]
Private Const ValidatorFileName As String = "DomValidation.js"
' The key to register a script key. In this example, the same key
' is used for registering both the script at the top of the
' page (called the client-side script block) and the script
' that is rendered at the bottom of the page (called startup
' script).
Private Const ValidatorIncludeScriptKey As String = "DomValidatorIncludeScript"
' The script block that is rendered at the bottom of the page.
Private Const ValidatorStartupScript As String = ControlChars.CrLf & _
"<script language=""javascript"">" & ControlChars.CrLf & _
"<!--" & ControlChars.CrLf & _
"var Page_ValidationActive = false;" & ControlChars.CrLf & _
"if (typeof(Page_DomValidationVer) == ""undefined"")" & ControlChars.CrLf & _
" alert(""{0}"");" & ControlChars.CrLf & _
"else" & ControlChars.CrLf & _
" ValidatorOnLoad();" & ControlChars.CrLf & ControlChars.CrLf & _
"function ValidatorOnSubmit() {{" & ControlChars.CrLf & _
" if (Page_ValidationActive) {{" & ControlChars.CrLf & _
" return ValidatorCommonOnSubmit();" & ControlChars.CrLf & _
" }}" & ControlChars.CrLf & _
"}}" & ControlChars.CrLf & _
"// -->" & ControlChars.CrLf & _
"</script>"
' Provides formatting information for emitting the script
' block at the top of the page.
Private Const IncludeScriptFormat As String = ControlChars.CrLf & _
"<script language=""{0}"" src=""{1}{2}""></script>"
' This method is called from OnPrerender in the
' Base Validator Control Sample.
Protected Sub RegisterValidatorCommonScript()
Dim location As String = Nothing
If Not Page.IsClientScriptBlockRegistered(ValidatorIncludeScriptKey) Then
' Provide the location of the script file.
' When using a script library, deployment can be
' a problem because the runtime is
' tied to a specific version of the script file.
' This sample takes the easy way out and insists that
' the file be placed in the /script subdirectory
' of the application.
' In other cases, you should place it where it
' can be shared by multiple applications and is placed
' in a separate directory so that different versions
' of a control library can run side by side.
' The recommended pattern is to put script files in the
' path /aspnet_client/<assembly name>/<assembly version>/".
location = Page.Request.ApplicationPath + "/script/"
' Create the client script block.
Dim includeScript As String = [String].Format(IncludeScriptFormat, "javascript", location, ValidatorFileName)
Page.RegisterClientScriptBlock(ValidatorIncludeScriptKey, includeScript)
End If
If Not Page.IsStartupScriptRegistered(ValidatorIncludeScriptKey) Then
If location Is Nothing Then
location = Page.Request.ApplicationPath + "/script/"
End If
' Provide an error message, which is localized.
Dim missingScriptMessage As String = "Validation script is missing '" & location & ValidatorFileName & "'"
' Create the startup script block.
Dim startupScript As String = [String].Format(ValidatorStartupScript, New Object() {missingScriptMessage})
Page.RegisterStartupScript(ValidatorIncludeScriptKey, startupScript)
End If
Page.RegisterOnSubmitStatement("ValidatorOnSubmit", "return ValidatorOnSubmit();")
End Sub
Nel seguente frammento di codice, tratto da Esempio di controllo di convalida base, viene illustrato come richiamare il metodo Page.RegisterArrayDeclaration, evidenziato in grassetto nel frammento, che aggiunge l'elemento sottoposto a rendering dal controllo a una variabile di matrice (Page_Validators
) sottoposta a rendering nello script client. La registrazione della variabile di matrice con la pagina, tramite la chiave Page_Validators
, assicura che nella pagina venga creata una sola variabile con questo nome.
// This method is called from Render in the
// Base Validator Control Sample.
protected virtual void RegisterValidatorDeclaration() {
string element = "document.getElementById(\"" + ClientID + "\")";
Page.RegisterArrayDeclaration("Page_Validators", element);
}
[Visual Basic]
' This method is called from Render in the
' Base Validator Control Sample.
Protected Overridable Sub RegisterValidatorDeclaration()
Dim element As String = "document.getElementById(""" & ClientID & """)"
Page.RegisterArrayDeclaration("Page_Validators", element)
End Sub
Accesso a un controllo negli script client
La classe base Control espone una proprietà denominata ClientID, di cui esegue il rendering in formato HTML come attributo ID dell'elemento sottoposto a rendering. In ASP.NET il ClientID per un controllo viene generato in modo dinamico e il ClientID di ciascun controllo in una pagina è sicuramente univoco. È quindi possibile accedere a un controllo, ovvero l'elemento di cui il controllo esegue il rendering, nel client utilizzandone l'ID in un DOM. Un controllo può inoltre utilizzare il ClientID per generare nomi univoci per qualsiasi ulteriore elemento di cui sia in grado di eseguire il rendering, ad esempio campi nascosti.
La generazione del valore del ClientID nel codice script (o nel codice di una libreria di script) può essere complessa, in quanto il ClientID deve essere inserito nella posizione corretta all'interno di una variabile di stringa. Nell'esempio seguente vengono utilizzati caratteri di escape per l'inserimento del ClientID in una stringa che costituisce il codice script nella stessa riga.
string element = "document.getElementById(\"" + ClientID + "\")";
Page.RegisterArrayDeclaration("Page_Validators", element);
[Visual Basic]
Dim element As String = "document.getElementById(""" & ClientID & """)"
Page.RegisterArrayDeclaration("Page_Validators", element)
È inoltre possibile utilizzare i metodi di overload Format della classe String per comporre uno script client che utilizzi il ClientID. Per ulteriori informazioni sulla formattazione, vedere Formattazione dei tipi.
Distribuzione di un file script
Il blocco di script generato da un controllo attivato da script può contenere codice script nella stessa riga oppure fornire il percorso di un file script. Entrambi i casi sono illustrati nell'esempio descritto in precedenza in questo argomento. Se il blocco fornisce il percorso di un file script, è necessario distribuire il file in modo che possa essere utilizzato da altre applicazioni e non crei conflitti di versione. Nell'esempio, il file script si trova in una sottodirectory denominata script
nella directory principale virtuale dell'applicazione Web.
// Provides the location of the script file.
location = Page.Request.ApplicationPath + "/script/";
[Visual Basic]
' Provides the location of the script file.
location = Page.Request.ApplicationPath & "/script/"
Sebbene questo sia il percorso adatto all'esempio, quello raccomandato per un file script che deve essere utilizzato da altre applicazioni è il seguente:
/aspnet_client/<nome assembly>/<versione assembly>/
La directory aspnet_client è una directory principale virtuale dell'applicazione Web creata nel computer dell'utente durante l'installazione di .NET Framework SDK o di Visual Studio .NET. Il percorso dei file script forniti con ASP.NET, ad esempio, è il seguente.
/aspnet_client/system_web/<versione di SDK installata>
Se nel computer sono installate più versioni di SDK, verranno visualizzate più sottodirectory di aspnet_client/system_web. Poiché una libreria di controlli è collegata a una versione specifica del file script, il modello di distribuzione consigliato consente l'esecuzione affiancata di versioni diverse di una libreria di controllo.
Notare, inoltre, che per ciascun sito Web ospitato nel computer viene creata una directory aspnet_client. Generalmente, un server ospita un solo sito Web. È tuttavia possibile che ospiti più di un sito: più siti comportano più copie della directory aspnet_client.
Attivazione o disattivazione del rendering di script
Un controllo attivato da script deve fornire agli utenti la possibilità di scegliere se attivare o disattivare il rendering dello script client. I controlli server Web di convalida di ASP.NET espongono una proprietà booleana denominata EnableClientScript che determina se il controllo esegue il rendering di script nel client. È possibile definire una proprietà che offra questa funzionalità nel modo seguente:
public bool EnableClientScript {
get {
object o = ViewState["EnableClientScript"];
return((o == null) ? true : (bool)o);
}
set {
ViewState["EnableClientScript"] = value;
}
}
[Visual Basic]
Public Property EnableClientScript() As Boolean
Get
Dim o As Object = ViewState("EnableClientScript")
If o Is Nothing Then
Return True
Else
Return CBool(o)
End If
End Get
Set
ViewState("EnableClientScript") = value
End Set
End Property
Prima del rendering, un controllo attivato da script deve controllare le funzioni del client e verificare se l'utente (lo sviluppatore di pagine) ha disattivato la creazione di script. Questi controlli vengono generalmente eseguiti nelle fasi precedenti al rendering e durante il rendering. Nel seguente frammento di codice tratto da Esempio di controllo di convalida base i controlli vengono eseguiti nella fase precedente al rendering.
private boolean renderUplevel;
protected override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
...
// Work out uplevelness now.
renderUplevel = DetermineRenderUplevel();
if (renderUplevel) {
// Helper method that creates script blocks
// and registers them with the page.
RegisterValidatorCommonScript();
}
}
// Helper method to check whether script should be rendered.
protected virtual bool DetermineRenderUplevel() {
// Must be on a page.
Page page = Page;
if (page == null || page.Request == null) {
return false;
}
// Check whether the user has turned off scripting and
// check browser capabilities. This custom control
// needs the W3C DOM level 1 for control manipulation
// and at least ECMAScript 1.2.
return (EnableClientScript
&& page.Request.Browser.W3CDomVersion.Major >= 1
&& page.Request.Browser.EcmaScriptVersion.CompareTo(new Version(1, 2)) >= 0);
}
[Visual Basic]
Private _renderUplevel As Boolean
Protected Overrides Sub OnPreRender(e As EventArgs)
MyBase.OnPreRender(e)
_preRenderCalled = True
' Force a re-query of properties for render.
_propertiesChecked = False
' Work out uplevelness now.
_renderUplevel = DetermineRenderUplevel()
If _renderUplevel Then
RegisterValidatorCommonScript()
End If
End Sub
' Helper method to check whether script should be rendered.
Protected Overridable Function DetermineRenderUplevel() As Boolean
' Must be on a page.
Dim page As Page = Page
If page Is Nothing Or page.Request Is Nothing Then
Return False
End If
' Check the browser capabilities.
' This is how you can get automatic fallback to server-side
' behavior. These validation controls need
' the W3C DOM level 1 for control manipulation
' and need at least ECMAScript 1.2 for the
' regular expressions.
Return EnableClientScript AndAlso _
page.Request.Browser.W3CDomVersion.Major >= 1 AndAlso _
page.Request.Browser.EcmaScriptVersion.CompareTo(New Version(1, 2)) >= 0
End Function
Per i controlli eseguiti durante la fase di rendering, vedere il metodo Render in Esempio di controllo di convalida base.
Rendering di script nel client
Per vedere come viene eseguito nel client il rendering dello script incapsulato dal controllo, compilare e distribuire gli esempi forniti in Esempi di controllo di convalida, richiedere la pagina fornita in Esempio di pagina di prova per la convalida e visualizzare l'origine della pagina nel browser. Nell'esempio seguente vengono mostrati l'HTML e lo script (lo script generato dai controlli è qui evidenziato in grassetto). Nella pagina si trovano numerosi controlli che generano script, tutti derivanti dal controllo base descritto in Esempio di controllo di convalida base. Di conseguenza, l'origine include script non trattati in questo argomento. Notare che quando viene visualizzata l'origine nel browser, il nome della directory dell'applicazione (samples
nell'esempio) viene sostituito dal nome della directory virtuale dell'applicazione dell'utente.
<HTML>
<HEAD>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<meta content="Microsoft Visual Studio .NET" name=GENERATOR>
<meta content=C# name=CODE_LANGUAGE>
<meta content="JavaScript (ECMAScript)" name=vs_defaultClientScript>
<meta content="Internet Explorer 3.02 / Navigator 3.0" name=vs_targetSchema>
<title>DOM Validators Test</title>
</HEAD>
<body>
<form name="ValTest" method="post" action="valtest.aspx" language="javascript" onsubmit="return ValidatorOnSubmit();" id="ValTest">
<input type="hidden" name="__VIEWSTATE" value="dDwxOTkwOTM1MDA5O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDEzPjs+O2w8dDw7bDxpPDE+O2k8Mz47aTw1PjtpPDc+Oz47bDx0PHA8cDxsPFRleHQ7PjtsPElFOz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDw1LjU7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDEuMjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8MS4wOz4+Oz47Oz47Pj47Pj47Pj47Pg==" />
<script language="javascript" src="/samples/script/DomValidation.js"></script>
<P><FONT face=Verdana size=5>DOM Validators Test</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=1 width=602 border=0 height=131>
<TR>
<TD style="WIDTH: 82px">Name:</TD>
<TD style="WIDTH: 164px"><input name="txtName" type="text" id="txtName" /></TD>
<TD><span id="valRequired" controltovalidate="txtName" errormessage="Required." evaluationfunction="RequiredFieldValidatorEvaluateIsValid" initialvalue="" style="color:Red;visibility:hidden;">Required.</span></TD>
</TR>
<TR>
<TD style="WIDTH: 82px">Postal Code:</TD>
<TD style="WIDTH: 164px"><input name="txtPostcode" type="text" id="txtPostcode" /></TD>
<TD><span id="valRegex" controltovalidate="txtPostcode" errormessage="Postcode must be 9999." evaluationfunction="RegularExpressionValidatorEvaluateIsValid" validationexpression="\d{4}" style="color:Red;visibility:hidden;">Postcode must be 9999.</span></TD>
</TR>
</TABLE></P>
<P>
<input type="submit" name="cmdSubmit" value="Submit" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="cmdSubmit" />
<input type="submit" name="cmdCancel" value="Cancel" id="cmdCancel" />
</P>
<div id="Panel1" style="border-color:#00C000;border-width:2px;border-style:Solid;height:55px;width:197px;">
<P>
Browser: <span id="lblBrowserName">IE</span><br>
Version: <span id="lblBrowserVersion">5.5</span><br>
Script Version: <span id="lblScriptVersion">1.2</span><br>
DOM Version: <span id="lblDomVersion">1.0</span><br>
Submit clicks: <span id="lblSubmitCount"> 0 </span><br>
Cancel clicks: <span id="lblCancelCount"> 0 </span><br>
</P>
</div>
<script language="javascript"><!-- var Page_Validators = new Array(document.getElementById("valRequired"), document.getElementById("valRegex")); // --></script><script language="javascript"><!--var Page_ValidationActive = false;if (typeof(Page_DomValidationVer) == "undefined") alert("Validation script is missing '/samples/script/DomValidation.js'");else ValidatorOnLoad();function ValidatorOnSubmit() { if (Page_ValidationActive) { return ValidatorCommonOnSubmit(); }}// --></script>
</form>
</body>
</HTML>
Vedere anche
Esempio di controllo di convalida base | Esempi di controllo di convalida