Na jednoduchém příkladu si ukážeme jak si v ASP.NET vytvořit vlastní validátor, který bude obsahovat jak validaci na serveru tak i validaci u klienta pomocí JavaScriptu.


Ukázkový validátor bude ověřovat zda zadaný řetězec má předepsanou délku.

Začneme tím, že si vytvoříme novou Class Library, kterou si pojmenujeme ValidatorLibrary. V této Class Library si vytvoříme třídu MyValidator. Abychom tuto třídu mohli podědit od CustomValidator, přidáme si do projektu referenci na assembly System.Web.

Naší třídě přidáme public property PocetZnaku, ve které budeme udržovat počet znaků, na který bude validátor ověřovat vstup. Kdybychom hodnotu ukládali pouze v proměnné a pokusili se ji programově změnit, tak by se nám při odeslání formuláře znovu nastavila na výchozí hodnotu property, zadanou při návrhu stránky. Aby hodnota property PocetZnaku vydrzela i odeslání formuláře musíme tedy pro její zapamatování použít například ViewState.

C++:
public int PocetZnaku
{
    set
    {
        ViewState["pocetZnaku"] = value;
    }
    get
    {
        object o = ViewState["pocetZnaku"];
        return (o == null) ? 1 : (int)o;
    }
}

Serverovou validaci vyřešíme překrytím metody EvaluateIsValid().

C++:
protected override bool EvaluateIsValid()
{
   string validovanaHodnota = GetControlValidationValue(ControlToValidate);
   if (validovanaHodnota.Length == PocetZnaku)
       return true;
   else
       return false;
}

Validaci u klienta v prohlížeči provedeme pomocí JavaScriptu, který se společně s validátorem vloží do stránky. Abychom do JavaScriptu dostali hodnotu property PocetZnaku, zavoláme funkci RegisterExpandoAttribute, která k objektu validátoru ve stránce (díky this.ClientID) přiřadí atribut pocetZnaku a nastaví mu odpovídající hodnotu.

C++:
protected override void OnInit(EventArgs e)
{
    ClientValidationFunction = "validacniFunkce";

    String validacniFunkce = @"<script type=""text/javascript"">
<!--
function validacniFunkce(sender, args) {
  if (args.Value.length == sender.pocetZnaku)
    args.IsValid = true;
  else
    args.IsValid = false;
}
//-->
</script>"
;

    //zaregistrujeme JavaScript do stránky
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "validacniFunkce", validacniFunkce);

    //přidáme počet znaků jako atribut k validátoru
    Page.ClientScript.RegisterExpandoAttribute(this.ClientID, "pocetZnaku", PocetZnaku.ToString());

     //zavoláme metodu předka
     base.OnInit(e);
}

Nyní už můžeme validátor zkompilovat a ve website (nebo webovém projektu) na něj přidat referenci. Pak už by měl být validátor vidět v Toolboxu Visual Studia. Pokud tam není, mělo by pomoct přepnutí do design módu. Pak už jej můžeme směle využít na stránce, stejně tak, jako ostatní validátory.

A ještě jednou celá třída pohromadě

C++:
using System;
using System.Web.UI.WebControls;

namespace ValidatorLibrary
{
    public class MyValidator : CustomValidator
    {
        public int PocetZnaku
        {
            set
            {
                ViewState["pocetZnaku"] = value;
            }
            get
            {
                object o = ViewState["pocetZnaku"];
                return (o == null) ? 1 : (int)o;
            }
        }

        protected override void OnInit(EventArgs e)
        {
            ClientValidationFunction = "validacniFunkce";
            String validacniFunkce = @"<script type=""text/javascript"">
<!--
function validacniFunkce(sender, args) {
  if (args.Value.Length == sender.pocetZnaku)
    args.IsValid = true;
  else
    args.IsValid = false;
}
//-->
</script>"
;
            //zaregistrujeme JavaScript do stránky
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "validacniFunkce", validacniFunkce);

            //přidáme počet znaků jako atribut k validátoru
            Page.ClientScript.RegisterExpandoAttribute(this.ClientID, "pocetZnaku", PocetZnaku.ToString());

            //zavoláme metodu předka
            base.OnInit(e);
        }

        protected override bool EvaluateIsValid()
        {
            string validovanaHodnota = GetControlValidationValue(ControlToValidate);
            if (validovanaHodnota.length == PocetZnaku)
                return true;
            else
                return false;
        }
    }
}