ControlParameter a validace   otázka

C#, VB.NET, ASP.NET WebForms, Komponenty

Trápím se, trápím.

Na stránce mám (pro zjednodušení) jeden asp:TextBox, který očekává jako vstup datum. K němu mám custom validátor, který vstup validuje. Funguje bez problémů.

Dále mám SqlDataSource, který plní ListView. SqlDataSource má jeden selectparameter typu asp:ControlParameter, který odkazuje na onen textbox s uživatelkým vstupem, který očekává datum.

Pokud zadám datum, je všechno OK. Pokud zadám prázdný řetězec, bez ohledu na nastavení parametru ConvertEmptyStringsToNull dostanu vždy prázdný řetězec (ten je validní, protože projde přes DateTime.TryParse). Dal bych přednost null, ale budiž, ošetřím to na straně databáze.

Problém nastane, když je uživatelský vstup nevalidní. Mám sice i klientskou validaci, ale řeším hypotetický případ, kdy validace nefunguje kvůli vypnutému javascriptu na klientovi. V takovém případě dostanu chybu o chybné konverzi na datetime, která ovšem nastane PŘED událostí OnSelecting. Při OnLoad SqlDataSource sice už ví, že Page.IsValid je false, ale nedokážu ho zastavit v provádění selectu, protože OnLoad EventArgs nemá property Cancel (jako má SqlDataSourceSelectingEventArgs), která by mu v tom zabránila. Nějaké návrhy, jak zastavit SqlDataSource v provedení selectu, pokud je ControlParameter nevalidní?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Doporučuji na výběr data použít místo TextBoxu tohle řešení (aby fakčilo se SqlDataSourcem, je třeba ho ještě trochu doplnit, je to v komentářích pod článkem).

http://vbnet.cz/clanek--165-tipy_a_triky...

Anebo si můžete napsat vlastní parametr (podědit z Parameter nebo klidně i z ControlParameter), který nevyhodí výjimku, když je datum nevalidní, ale jenom dál předá null či prázdný řetězec.

A jinak pokud má parametr nastaveno ConvertEmptyStringToNull, tak do databáze posílá NULL (v kódu to ale musíte testovat proti DBNull.Value, ne proti obyčejné hodnotě null).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky Tome za snahu pomoci :)

Já tam ve skutečnosti mám javascriptovou komponentu, která zadání datumu umožňuje & validuje vstup, ale řešil jsem ten hloupý případ, kdy má klient vypnutý javascript.

Vlastní parametr asi bude nejčistší řešení, já se zatím spokojil s tím, že na OnLoad tam ten parametr přidám v kódu, jen pokud je validní, a na OnSelecting hodím e.Cancel=true, pokud nemám požadovaný počet parametrů.

Co se týče ConvertEmptyStringToNull, sypu si popel na hlavu. Zkoušel jsem to, ale zřejmě v kombinaci s jinými faktory se to chovalo tak divně, že jsem nabyl dojmu, že to nefunguje. Teď jsem pro klid duše udělal ještě jeden test, abych ti to mohl omlátit o hlavu a hle! vše funguje, jak má. Takže tradiční problém mezi klávesnicí a židlí :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dávat tohle do OnLoad je prasárna, tohle patří do vlastního parametru. A "takhle mi to funguje, tak už to nebudu měnit", není odpověď, za kterou by bylo možno někoho pochválit.

Btw kdo jsi? Abych měl představu, kdo mi chce co omlátit o hlavu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback