Advanced Validators: validazione a gruppi

2 pagine in totale: <<Indietro 1 [2]

Validazione lato client

Sul client il funzionamento è un po' più complicato. Gli script necessari vengono inclusi nella pagina e sono di default contenuti nella cartella "\aspnet_client\system_web\1_1_4322" (il numero cambia a seconda della versione di ASP.NET, in questo caso è la 1.).

Il nome del file in cui c'è la logica di validazione è WebUIValidation.js e dovremo mettere mano a questo file, anche se non è necessario modificare l'originale. Possiamo indicare una nuova locazione dello script mediante la sezione di configurazione configuration/system.web/webControls/@clientScriptsLocation, un attributo sulla quale viene eseguito uno String.Format passando come parametri nome, namespace e versione del Framework. Quindi supponendo che vogliamo inserire lo script nella cartella system_web\1_1_4322 dell'applicazione corrente (quindi non della root del sito), il web.config sarà:

<configuration>
<system.web>
  <webControls clientScriptsLocation="{0}/{1}/" />
</system.web>
</configuration>

Non ci resta che vedereil funzionamento del codice js. Il rendering html base di un validatore è:

<span id="RequiredFieldValidator1" controltovalidate="txt" errormessage="errore" display="Dynamic|Static" evaluationfunction="funzionedavalidare" />

Come avrete notato gli attributi non sono altro che le proprietà che ogni validatore dispone, definiti nella classe base BaseValidator, eccetto evaluationfunction che è il nome della funzione da validare e che ogni controllo è responsabile di specificare.

Alla pressione di un Button o di un LinkButton, viene richiamato il metodo JavaScript Page_ClientValidate il quale non fa altro che scorrere l'array Page_Validators e richiamare la funzione ValidatorValidate :

function ValidatorValidate(val) { 
  val.isvalid = true;
  if (val.enabled != false) {
    if (typeof(val.evaluationfunction) == "function") {
  val.isvalid = val.evaluationfunction(val);
    }
  }
  ValidatorUpdateDisplay(val);
}

Come si può notare, se il pulsante è abilitato richiama la funzione indicata dall'attributo evaluationfunciont citata poco fa per impostare la variabile isvalid a seconda dell'esito della validazione.

Detto questo si intuisce che dobbiamo aggiungere un nostro attributo "validationGroup" e modificare questa funzione in modo che lo tenga in considerazione.

Come sul server inoltre, dobbiamo fare in modo che il pulsante che avvia la validazione specifichi anche il gruppo da validare.

Attuiamo ciò che abbiamo appena detto, modificiando il controllo in modo da inserire anche il nostro attributo:

public class RequiredFieldValidator : System.Web.UI.WebControls.RequiredFieldValidator, IAdvancedValidator
{
  public RequiredFieldValidator()
  {
  }
  protected override void AddAttributesToRender(HtmlTextWriter writer)
  {
    if (base.RenderUplevel)
    writer.AddAttribute("validationGroup", GroupName);
    base.AddAttributesToRender (writer);
  }
[?]

Ho omesso il resto del codice già mostrato prima per la parte relativa alla validazione server. La proprietà RenderUplevel indica se stiamo facendo il rendering ad un browser che supporta DHTML e JavaScript 1.2.

Modifichiamo anche il nostro pulsante per indicare anche il nome del gruppo da validare:

public class Button : System.Web.UI.WebControls.Button, IAdvancedValidatorButton
{
  protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
  {
    AdvancedValidatorUtil.AddButtonValidationAttributes(this, ValidationGroupName);
    base.AddAttributesToRender (writer);
  }
[...]
  public static void AddButtonValidationAttributes(System.Web.UI.WebControls.WebControl webControl, string validationGroupName)
{
  string onclick = webControl.Attributes["onclick"];
  onclick = String.Format("{0}Page_CurrentGroup = '{1}';",
    onclick,
    HttpUtility.HtmlAttributeEncode(validationGroupName));
  webControl.Attributes["onclick"] = onclick;
}

Viene utilizzato anche in questo caso un metodo statico della nostra classe di utility, cosicché potremo sfruttarla anche per qualsiasi altro controllo alla quale vogliamo aggiungere questa funzionalità.

Il risultato HTML dei nostri controlli, rispettivamente del RequiredFieldValidator e del Button, sarà:

<span validationGroup="g1" id="RequiredFieldValidator1" controltovalidate="txt" errormessage="errore" display="Dynamic" evaluationfunction="RequiredFieldValidatorEvaluateIsValid" initialvalue="" ></span>
  <input type="submit" name="Button1" value="Vai" onclick="Page_CurrentGroup = 'g1';if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="Button1" />

Il file WebUiValidation.js modificato conterrà all'inizio, nelle variabili dichiarate, la nostra variabile Page_CurrentGroup:

var Page_CurrentGroup = "";
  Mentre la funzione ValidatorValidate modificata sarà:
  function ValidatorValidate(val) { 
  val.isvalid = true;
  if (val.enabled != false) {
    if (typeof(val.evaluationfunction) == "function") {
    var gr = val.validationGroup;
    if (!(gr)) gr = "";
    if (gr == Page_CurrentGroup)
     val.isvalid = (val.evaluationfunction(val));
    }
  }
  ValidatorUpdateDisplay(val);
}

Il codice verifica la presenza dell'attributo validationGroup e se coincide con quello attuale indicato da Page_CurrentGroup, prosegue con la normale validazione. In caso contrario mantiene il valore originale e cioè "true" (inizio funzione).

I due validator in azione

Conclusioni

Abbiamo così raggiunto il nostro scopo. Nell'articolo ho dotato della funzionalità di validazione a gruppi solo un Button e un RequiredFieldValidator creandone di nuovi. Allo stesso modo però, cambiando la classe dalla quale ereditare possiamo arricchire tutti i validatori di ASP.NET. Nell'allegato sono estesi tutti i validatori del Framework, integrabili in Visual Studio.NET, ed è presente una pagina d'esempio che li sfrutta.

Questi nuovi controls rappresentano un primo passo verso ASP.NET 2.0, in modo da rendere meno difficile la vita degli sviluppatori che stanno usando le versioni della famiglia 1.x.

Approfondimenti

2 pagine in totale: <<Indietro 1 [2]

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC