ASP.NET - Ovládací prvky používající JavaScript
Co tento článek ukazuje
- Jak vkládat do Asp.Net stránky klientské skripty
- Jak načítat data uložená jako resources v assembly.
- Jak předávat data mezi klientským a serverovým skriptem
- Jak vyvolávat z JavaScriptu postback
Klientské skriptování (obvykle realizované pomocí JavaScriptu) umožňuje některé jednodušší operace provádět ve webových prohlížečích na straně klienta. Tím se výrazně zrychlí odezva aplikace a také se sníží zátěž serveru (protože není potřeba posílat na server dotaz). Při tvorbě klientských skriptů je podstatné uvědomit si rozdíl mezi klientrkým skriptem, nejčastěji JavaScriptem, který je zpracováván ve webovém prohlížeči a serverovým kódem (C#, Vb.Net), který je zpracováván na straně serveru.
Ukázkový ovládací prvek
Ovládací prvek, na kterém se pokusím demonstrovat práci s JavaScriptem je ovládací prvek (ascx), ve kterém se nachází textové pole a tlačítka + a -. Pomocí JavaScriptu se při kliknutí na tlačítka zvýší nebo sníží číslo vyplněnné v textovém políčku. Dále se za políčkem vypisuje několik odkazů, které na straně serveru nastaví hodnotu v textovém políčku a vyvolají serverovou událost. V ukázkové aplikaci se při vyvolání této události zobrazí červený label s informacemi.
Předávání dat mezi klientem a serverem
Nejprve se podíváme jak lze předávat data mezi klientským a serverovým
skriptem. V JavaScriptu i v Asp.Net lze poměrně snadno získat a měnit
hodnotu uloženou ve formulářových ovládacích prvcích, například textové pole
nebo zkryté pole (input type=hidden
), které umožňuje předávat data
aniž by data viděl uživatel. Jediným problémem je,
že Asp.Net automaticky generuje id ovládacích prvků, takže pokud chcete z
JavaScriptu měnit hodnotu v textovém poli pojmenovaném txtNum
,
musíte vygenerovat část klientského skriptu, která přistupuje k datům.
Následující příklad ukazuje, jak lze pomocí JavaScriptu měnit
hodnotu zadanou v textovém políčku. V první ukázce je zobrazný
kód z ovládacího prvku (ascx
soubor) a v druhé ukázce
je vidět jaký kód vygeneruje Asp.Net pokud tento ovládací prvek
vložíte do stránky.
<!-- Takto vypada kod v ascx souboru -->
<asp:TextBox runat="server" id="txt"></asp:TextBox>
<input type="button" value="Nastav" onclick="
var el=document.getElementById('<%=txt.ClientID %>');
el.value='Ahoj'; " />
<!-- Kod, ktery se vygeneruje muze vypadat takto: -->
<input name="cc2:txt" type="text" id="cc2_txt" />
<input type="button" value="Nastav" onclick="
var el=document.getElementById('cc2_txt');
el.value='Ahoj'; " />
V ukázkové aplikaci je v ovládacím prvku následující kód, který
používá funkce numInc
a numDec
. Způsob, kterým
se tyto funkce vkládají do stránky je popsán níže.
<!-- Textove pole na zadavni cisla --> <asp:TextBox Columns="6" Runat="server" ID="txtNum"></asp:TextBox> <!-- Tlacitka na prciteni a odecteni 1 --> <input type="button" value="+" onclick=" numInc(document.getElementById('<%=txtNum.ClientID%>'));"> <input type="button" value="-" onclick=" numDec(document.getElementById('<%=txtNum.ClientID%>'));">
Pokud byste chtěli místo asp:TextBox
, který umožňuje uživateli
přímo měnit hodnotu použít neviditelný prvek, vypadal by první řádek v první
ukázce takto: <input type="hidden" id="txt" runat="server" />
.
Asp.Net v současné době neobsahuje pro neviditelné pole ovládací prvek, proto
je potřeba použít standardní HTML ovládací prvek, s nastaveným atributem
runat=server
.
Pozor: Pokud používáte v klientském skriptu pole, které se nezobrazuje
uživateli neznamená to, že do něj uživatel-útočník nemůže vložit hodnotu,
kterou neočekáváte. Je tedy nutné s těmito daty pracovat s největší opatrností!
Vkládání JavaScriptového kódu
Pokud máte ovládací prvek, kde je větší množství JavaScriptového kódu
(například několik JS funkcí), není vhodné aby se tento kód vkládal do
stránky s každým ovládacím prvke, ale stačí, když se tento kód vloží do
stránky pouze jednou. Dále je vhodné, když je skript uložen v souboru,
který je připojen k assembly jako resource (protože tak můžete mít skript
v zvláštním souboru). Při vkládání skriptu do stránky poté stačí pouze
načíst soubor z assembly a vložit ho do stránky. Soubor připojíte k projektu
jako resource tak, že v okně 'Properties' zvolíte z nabídky 'Build Action'
volbu 'Embedded resource'. Při načítání je potřeba dávat pozor na jméno
resource, které je ve tvaru Namespace.Soubor.xyz
,
kde Namespace
je jméno výchozího jmenného prostoru (lze jej nalézt
ve vlastnostech projektu).
// Zajisti, ze se skript bude vkladat pouze jednou if (!Page.IsClientScriptBlockRegistered("cont-control")) { // pomoci reflection ziska aktualni assembly Assembly asm=Assembly.GetExecutingAssembly(); // nacte z assembly soubor "script.html" StreamReader sr=new StreamReader (asm.GetManifestResourceStream("UsingJavaScript.script.html")); // a vlozi do stranky JS blok Page.RegisterClientScriptBlock("cont-control",sr.ReadToEnd()); sr.Close(); }
Poznámka: Ač chceme vložit do stránky JavaScriptový kód je
potřeba vkládat i tag <script>
a proto je skript
v resources uložený jako HTML soubor.
Vyvolávání post-backu
Další téma tohoto článku je problém, jak z klientského skriptu vyvolat
post-back (tedy jak po nějaké akci uživatele odeslat požadavek na server).
Jediné HTML prvky, které automaticky odesílají data zpět na server jsou
input type=submit
a input type=image
, nicméně
v Asp.Net existují i další ovládací prvky, které potřebují odesílat
data na server podobným způsobem. K tomu se v Asp.Net používá klientské
skriptování, konkrétně funkce __doPostBack
, které jste
si mohli všímnout v generovaném HTML kódu Asp.Net stránek.
Tuto funkci není nutné používat přímo, protože v Asp.Net existují
metody, které tvorbu takových ovládacích prvků zjednodušují.
Pokud chcete ve vašem ovládacím prvku vygenerovat kód, který
vyvolá post-back a po odeslání událost zpracovat budete potřebovat
implementovat rozhraní IPostBackEventHandler
. Toto rozhraní
obsahuje jedinou metodu, která je zodpovědná za zpracování post-backu.
Ke generování klientského skriptu, který postback vyvolá se používá metoda
Page.GetPostBackClientHyperlink
. Jak vyvolávat a zpracovávat
postback demonstruje následující ukázka:
Jedná se pouze o upravenou část kódu. Pro komletní ukázku se podívejte do přiložených zdrojových kódů.
// Ovladaci prvek, ktery vyuziva post-back public class CountControl : System.Web.UI.UserControl, IPostBackEventHandler { // Do tohoto ovladaciho prvku se vlozi generovane odkazy protected Literal ltrLinks; // Vygenerovat odkazy.. private void Page_Load(object sender, System.EventArgs e) { StringBuilder sb=new StringBuilder(); for(int i=1; i<=10; i++) { // generuje kod, ktery pouziva __doPostBack. // Pri kliknuti na generovany odkaz se zavola // metoda RaisePostBackEvent (s parametrem 'i') sb.AppendFormat("<a href=\"{0}\">{1}</a>", Page.GetPostBackClientHyperlink(this,i.ToString()),i); } ltrLinks.Text=sb.ToString(); } // Metoda z rozhrani IPostBackEventHandler // Vola se po kliknuti na odkaz a zpracovava post-back // eventArgument je parametr (v tomto pripade cislo) public void RaisePostBackEvent(string eventArgument) { // .. zpracovat kliknuti na odkaz .. } }
Všimněte si, že volání funkce __doPostBack
za
vás obstará samotné Asp.Net a proto, pokud se v některé následující
verzi Asp.Net změní způsob jakým je post-back vyvoláván, nebude
takový problém aplikaci upravit. Nevýhodou ale je, že pokud v JavaScriptu
něco spočítáte, nemůže tuto hodnotu předat serveru přímo jako parametr.
K tomuto účelu lze ale použít výše popsanou techniku, kdy si vypočtenou
hodnotu uložíte do pole input type=hidden
, vyvoláte post-back
a na straně serveru uloženou hodnotu opět načtete.