Snad každý web dnes v sobě obsahuje formulář, ať už objednávkový, registrační atd. Správnost údajů v těchto formulářích musíme často testovat před jejich dalším zpracováním. K tomu také slouží schvalovací (kontrolní) komponenty (validation controls).

Před přečtením článku doporučuji shlédnutí příkladu.

Přestože jsou velmi robustní a flexibilní, je jejich použití velmi prosté. Nastavením vlastnosti ControlToValidate na nějaký z ovládacích prvků na formuláři zajistíte jeho kontrolu schvalovacím prvkem dle výběru. Těchto prvků je celkem 5 + 1 souhrnný informační.

  1. RequiredFieldValidator – označuje, že ovládací prvek, ke kterému je připojen, musí být vyplněn; je tedy nezbytný pro úspěšné odeslání formuláře. Nastavují se tyto vlastnosti:
    • ErrorMessage – určuje text, který se ukáže po neúspěšné kontrole ovládacího prvku.
    • ControlToValidate – určuje ovládací prvek, který bude kontrolován zda je vyplněn.
  2. CompareValidator – porovnává hodnotu ovládacího prvku proti hodnotě jiného ovládacího prvku nebo konstantní hodnotě. Je třeba nastavit tyto vlastnosti.
    • ErrorMessage – určuje text, který se ukáže po neúspěšné kontrole ovládacího prvku.
    • ControlToCompare – určuje ovládací prvek, proti kterému se bude porovnávat.
    • ControlToValidate – určuje ovládací prvek, který bude porovnáván buď proti ControlToCompare nebo konstantně.
    • Operator – určuje, jaká operace se bude provádět při porovnávání (rovnost, nerovnost, větší, menší…).
    • Type – datový typ, který bude zadáván do ovládacích prvků (String, Integer…).
    • ValueToCompare – konstanta, proti které se může porovnávat.
  3. RangeValidator – kontroluje, zda je hodnota v ovládacím prvku k němu připojeném v daném rozsahu.
    • ErrorMessage – určuje text, který se ukáže po neúspěšné kontrole ovládacího prvku.
    • ControlToCompare – určuje ovládací prvek, který se bude kontrolovat.
    • MaximumValue – maximální hodnota ovládacího prvku.
    • MinimumValue – minimální hodnota ovládacího prvku.
    • Type – datový typ, který bude zadáván do ovládacího prvku (String, Integer…)
  4. RegularExpressionValidator – využívá ke kontrole svého ovládacího prvku sílu regulárních výrazů.
    • ValidationExpression – obsahuje regulární výraz sloužící ke kontrole.
  5. CustomValidator – dává programátorovi největší svobodu při kontrole údajů v ovládacím prvku k němu připojeném. Naproti tomu však požaduje ruční psaní všech kontrolních funkcí.
    • ClientValidationFunction – jméno funkce provádějící na straně klienta ověřování prvků.
    • ServerValidateudálost – vyvolává se při ověřování prvků na straně serveru.
  6. ValidationSummary – nic neověřuje, ani nekontroluje, pouze soustřeďuje výsledky všech kontrolních prvků, které najednou vypisuje jako souhrn.

Všechny tyto prvky až na ValidationSummary obsahují ještě důležitou vlastnost Display. Tato vlastnost může být:

  • Static – čeká se s kontrolou až na odeslání formuláře serveru, který provede kontrolu a vrátí výsledek.
  • Dynamic – provádí kontrolu okamžitě po vyplnění ovládacího prvku pomocí klientských skriptů. Tyto skripty se však jako všechno ostatní v ASP.NET generují v závislosti na schopnostech prohlížeče. Pokud je prohlížeč podporovat nebude, přistoupí .NET framework ke kontrole na straně serveru.

Kontrola na straně serveru je nejdůležitější, aby někdo nemohl podvrhnout serveru data, která nebyla zkontrolována klientským skriptem a tím páchat škodu. Kontrola na straně serveru se tedy provádí vždy. Avšak kontrola na straně klienta je užitečná i tím, že se data nemusí posílat stále sem a tam, jen kvůli kontrole a vytěžovat tím server a linku na které je připojen a klientovi šetří průtok dat a zvyšuje pohodlí.

Vytvořil jsem na ukázku formulář, který v sobě obsahuje všech těchto 5 + 1 kontrolních prvků. Jeho základem je webový formulář Form.aspx, který obsahuje tento kód:

<%@ Page language="c#" Codebehind="Form.aspx.cs" AutoEventWireup="false" Inherits="Validators.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>Testovací formulář</title>
</HEAD>
<asp:label id="Label1" style="Z-INDEX: 104; LEFT: 221px; POSITION: absolute; TOP: 33px" runat="server" Font-Bold="True" Font-Size="Large">Testovací formulář</asp:label>
<asp:label id="lblState" style="Z-INDEX: 126; LEFT: 16px; POSITION: absolute; TOP: 64px" runat="server" Font-Bold="True" Font-Size="Large" Visible="False" ForeColor="Green">Odesláno</asp:label>
<form id="Form1" method="post" runat="server">
<asp:requiredfieldvalidator id="RequiredFieldValidator1" style="Z-INDEX: 125; LEFT: 280px; POSITION: absolute; TOP: 88px" runat="server" ErrorMessage="Nutno zadat jméno! (RequiredFieldValidator)" ControlToValidate="txtName" Display="Dynamic"></asp:requiredfieldvalidator>
<asp:requiredfieldvalidator id="RequiredFieldValidator5" style="Z-INDEX: 123; LEFT: 280px; POSITION: absolute; TOP: 216px" runat="server" ErrorMessage="Nutno zadat číslo dělitelné pěti beze zbytku! (RequiredFieldValidator)" ControlToValidate="txtNumber" Display="Dynamic"></asp:requiredfieldvalidator>
<asp:requiredfieldvalidator id="RequiredFieldValidator4" style="Z-INDEX: 119; LEFT: 280px; POSITION: absolute; TOP: 176px" runat="server" ErrorMessage="Nutno zadat heslo! (RequiredFieldValidator)" ControlToValidate="txtPassword" Display="Dynamic"></asp:requiredfieldvalidator>
<asp:requiredfieldvalidator id="RequiredFieldValidator3" style="Z-INDEX: 118; LEFT: 280px; POSITION: absolute; TOP: 136px" runat="server" ErrorMessage="Nutno zadat email! (RequiredFieldValidator)" ControlToValidate="txtEmail" Display="Dynamic"></asp:requiredfieldvalidator>
<asp:requiredfieldvalidator id="RequiredFieldValidator2" style="Z-INDEX: 117; LEFT: 280px; POSITION: absolute; TOP: 112px" runat="server" ErrorMessage="Nutno zadat věk! (RequiredFieldValidator)" ControlToValidate="txtAge" Display="Dynamic"></asp:requiredfieldvalidator>
<asp:comparevalidator id="CompareValidator1" style="Z-INDEX: 100; LEFT: 280px; POSITION: absolute; TOP: 176px" runat="server" ErrorMessage="Zadaná hesla se neshodují! (CompareValidator)" ControlToValidate="txtPassword" Display="Dynamic" ControlToCompare="txtPassword2"></asp:comparevalidator>
<asp:rangevalidator id="RangeValidator1" style="Z-INDEX: 101; LEFT: 280px; POSITION: absolute; TOP: 112px" runat="server" ErrorMessage="Věk musí být v rozmezí 1-100! (RangeValidator)" ControlToValidate="txtAge" MinimumValue="1" MaximumValue="100" Display="Dynamic" Type="Integer"></asp:rangevalidator>
<asp:regularexpressionvalidator id="RegularExpressionValidator1" style="Z-INDEX: 102; LEFT: 280px; POSITION: absolute; TOP: 136px" runat="server" ErrorMessage="Emailová adresa není platná! (RegularExpressionValidator)" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ControlToValidate="txtEmail" Display="Dynamic"></asp:regularexpressionvalidator>
<asp:validationsummary id="ValidationSummary1" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 272px" runat="server" Height="24px" Width="616px" BorderStyle="Double" HeaderText="Neúplný nebo špatně vyplněný formulář"></asp:validationsummary>
<asp:label id="Label2" style="Z-INDEX: 106; LEFT: 16px; POSITION: absolute; TOP: 88px" runat="server">Jméno:</asp:label>
<asp:label id="Label3" style="Z-INDEX: 107; LEFT: 16px; POSITION: absolute; TOP: 112px" runat="server">Věk:</asp:label>
<asp:label id="Label4" style="Z-INDEX: 108; LEFT: 16px; POSITION: absolute; TOP: 136px" runat="server">Email:</asp:label>
<asp:textbox id="txtName" style="Z-INDEX: 109; LEFT: 112px; POSITION: absolute; TOP: 88px" runat="server"></asp:textbox>
<asp:textbox id="txtAge" style="Z-INDEX: 110; LEFT: 112px; POSITION: absolute; TOP: 112px" runat="server"></asp:textbox>
<asp:textbox id="txtEmail" style="Z-INDEX: 111; LEFT: 112px; POSITION: absolute; TOP: 136px" runat="server"></asp:textbox>
<asp:label id="Label5" style="Z-INDEX: 112; LEFT: 16px; POSITION: absolute; TOP: 160px" runat="server">Heslo:</asp:label>
<asp:label id="Label6" style="Z-INDEX: 113; LEFT: 16px; POSITION: absolute; TOP: 184px" runat="server">Ověření hesla:</asp:label>
<asp:textbox id="txtPassword" style="Z-INDEX: 114; LEFT: 112px; POSITION: absolute; TOP: 160px" runat="server"></asp:textbox>
<asp:textbox id="txtPassword2" style="Z-INDEX: 115; LEFT: 112px; POSITION: absolute; TOP: 184px" runat="server"></asp:textbox>
<asp:button id="btnSend" style="Z-INDEX: 116; LEFT: 136px; POSITION: absolute; TOP: 240px" runat="server" Text="Odeslat"></asp:button>
<asp:customvalidator id="CustomValidator1" style="Z-INDEX: 120; LEFT: 280px; POSITION: absolute; TOP: 216px" runat="server" ErrorMessage="Číslo není dělitelné pěti beze zbytku! (CustomValidator)" ControlToValidate="txtNumber" Display="Dynamic" ClientValidationFunction="ValidateNumber"></asp:customvalidator>
<asp:label id="Label7" style="Z-INDEX: 121; LEFT: 16px; POSITION: absolute; TOP: 208px" runat="server">Číslo dělitelné</asp:label>
<asp:textbox id="txtNumber" style="Z-INDEX: 122; LEFT: 112px; POSITION: absolute; TOP: 216px" runat="server"></asp:textbox>
<asp:label id="Label8" style="Z-INDEX: 124; LEFT: 16px; POSITION: absolute; TOP: 224px" runat="server">5 beze zbytku:</asp:label>
</form>
<script language="vbscript">
Sub ValidateNumber(source, arguments)
If (arguments.Value mod 5) = 0 Then
   arguments.IsValid = true
Else
  arguments.IsValid = false
End If
End Sub
</script>
</FORM>
</body>
</HTML>

Jelikož většina programové logiky je již obsažena v .NET frameworku, tak kód pro obsluhu těchto prvků bude opravdu strohý. Vlastně potřebujeme pouze kód pro obsluhu prvku CustomValidator na serverové straně. Zapíšeme tedy do souboru form.aspx.cs následující kód:

using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Validators
{
    public class WebForm1 : System.Web.UI.Page
    {
         protected System.Web.UI.WebControls.Label Label8;
         protected System.Web.UI.WebControls.TextBox txtNumber;
         protected System.Web.UI.WebControls.Label Label7;
         protected System.Web.UI.WebControls.CustomValidator CustomValidator1;
         protected System.Web.UI.WebControls.Button btnSend;
         protected System.Web.UI.WebControls.TextBox txtPassword2;
         protected System.Web.UI.WebControls.TextBox txtPassword;
         protected System.Web.UI.WebControls.Label Label6;
         protected System.Web.UI.WebControls.Label Label5;
         protected System.Web.UI.WebControls.TextBox txtEmail;
         protected System.Web.UI.WebControls.TextBox txtAge;
         protected System.Web.UI.WebControls.TextBox txtName;
         protected System.Web.UI.WebControls.Label Label4;
         protected System.Web.UI.WebControls.Label Label3;
         protected System.Web.UI.WebControls.Label Label2;
         protected System.Web.UI.WebControls.ValidationSummary ValidationSummary1;
         protected System.Web.UI.WebControls.RegularExpressionValidator RegularExpressionValidator1;
         protected System.Web.UI.WebControls.RangeValidator RangeValidator1;
         protected System.Web.UI.WebControls.CompareValidator CompareValidator1;
         protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator2;
         protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator3;
         protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator4;
         protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator5;
         protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1;
         protected System.Web.UI.WebControls.Label lblState;
         protected System.Web.UI.WebControls.Label Label1;
         override protected void OnInit(EventArgs e)
         {
             this.btnSend.Click += new System.EventHandler(this.btnSend_Click);
             this.CustomValidator1.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(this.ValidateNumber);
             base.OnInit(e);
         }
         private void ValidateNumber(object source, System.Web.UI.WebControls.ServerValidateEventArgs args)
         {
             args.IsValid = ((Convert.ToInt32(args.Value) % 5) == 0);
         }
         private void btnSend_Click(object sender, System.EventArgs e)
         {
             if(Page.IsValid)
             {
                 foreach(Control c in Page.Controls)
                     c.Visible = false;
                 lblState.Visible = true;
                 Label1.Visible = true;
             }
         }
    }
}

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět