textBox-formátování textu   zodpovězená otázka

C#, VB.NET, ASP.NET WebForms

Zdravím a zároveň prosím o radu.

Zkouším dělat takové malé fórum a chtěl bych vědět následující:

-Pomocí komponenty formView uživatlé vkládají příspvěky.

-FormView obsahuje několik textboxů přičemž hlavní (do kterého se píše příspěvek) je multiline

A já bych chtěl vědět jak se v praxi řeší, že pokud uživatel zmáčkně enter (tím se přesune na další řádek v textboxu) aby se tato skutečnost zohlednila i při načtení textu z databáze (v současné chvíli se mi vše načte za sebe a místo enteru se vloží pouze mezera).

To si musím odchytit stisknutí enteru a do textu vložit nějáké znaky, uložit je do databáze a při načítání text procházet, znaky hledat a následně je vymazat aby je neviděl uživatel? Nebo jak se to dělá správně?

Prosím o správé nasměrování abych neobjevoval kolo nebo ještě hůř, abych se nevydal uplně špatnou cestou.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Problémem je, že odřádkování nefunguje v HTML kódu. Je tedy důležité ho nahradit za řetězec <br />.

Nejprve bych celý text encódoval do html, abych zabránil použití javascriptu a jiného klientského škodlivého kódu:

Dim vysledek = HttpContext.Current.Server.HtmlEncode(text)

No a pak pouze nahradím konec řádku za html značku:

vysledek = vysledek.Replace(Environment.NewLine, "<br />" + Environment.NewLine)

Když budete pak příspěvek zobrazovat, vykreslujte přímo na stránku nebo použijte Literal, aby se <br /> nepřevedlo na text.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Moc děkuji. Jsem zas o něco málo moudřejší:) Kdybych to řešil po svým šel bych na to zbytečně moc složitě:)

Kód jsem dal do události click tlačítka insertButton a s tím souvisí ještě jedna věc. U všech textboxů mám nastavenou určitou povolenou délku (pro jméno 50 znaků, pro nadpis 100 znaků a pro text příspěvku 8 000 znaků.) Víc znaků uživatel do textboxu nezapíše, ale jelikož parsuju textový řetězec kvůli hmtl značkám může se stát, že znak < je nahrazen &amp;lt; (tady se mi to nezobrazuje celé ale má to mít 8 znaků) takže ve finále se může stat že bude tahle délka překročena protože stačí aby uživatel napsal 7x znak < a délka řetězce po parsování bude 56 znaků. Samozřejmě v té události click si můžu zkontrolovat délku řetězce, ale nevím jak přeruším z této události odesílání dat na server pokud zjistím že max. délka byla překročena.

Tímto kódem parsuju text a u textu příspěvku přidávám mezery:

 Protected Sub InsertButton_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim TextBoxText As TextBox = CType(FormView1.FindControl("tema_textTextBox"), TextBox)
        Dim vysledek = HttpContext.Current.Server.HtmlEncode(TextBoxText.Text)
        vysledek = vysledek.Replace(Environment.NewLine, "<br />" + Environment.NewLine)
        TextBoxText.Text = vysledek
        
        
        Dim TextBoxUzivatel As TextBox = CType(FormView1.FindControl("uzivatelTextBox"), TextBox)
        Dim vysledekUzivatel = HttpContext.Current.Server.HtmlEncode(TextBoxUzivatel.Text)
        TextBoxUzivatel.Text = vysledekUzivatel
        If TextBoxUzivatel.Text.Length > 50 Then
            MsgBox("Jméno je příliš dlouhé. Je povoleno zada max. 50 znaků")
        End If
        
        Dim TextBoxPredmet As TextBox = CType(FormView1.FindControl("tema_textTextBox"), TextBox)
        Dim vysledekPredmet = HttpContext.Current.Server.HtmlEncode(TextBoxPredmet.Text)
        TextBoxUzivatel.Text = vysledekPredmet
        If TextBoxPredmet.Text.Length > 100 Then
            MsgBox("Předmět je příliš dlouhý. Je povoleno zada max. 100 znaků")
        End If
    End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zaprvé na omezení délky textu se nemůžete spolehnout - hlídá to jen webový prohlížeč, když někdo bude chtít podvrhnout víc znaků, tak to stejně udělá.

Zadruhé je nutné vůbec taková omezení zavádět? Co když bude někdo chtít napsat delší příspěvek? Doporučuji v databázi používat pro text příspěvku datový typ NVARCHAR(MAX), který nemá omezenou délku (resp. má, ale maximální hodnota je ve většině případů nedosažitelná). A nadpisu a jménu dejte třeba 1000 nebo 500 znaků. Pokud používáte VARCHAR, tak se použije jenom tolik znaků, kolik je skutečně potřeba. Pokud to nikdo nevyužije, ničemu to nebude vadit, pokud to někdo bude potřebovat, bude to fungovat.

Jinak co se týče konkrétního problému, možností je víc, mě přijde nejlepší dát maximální délku velkou a vůbec ji nekontrolovat - pokud uživatel zadá moc dlouhý řetězec, tak se prostě ořízne.

Dále doporučuji pro validace používat validátory k tomu určené. A v neposlední řadě je naprosto špatně volat funkci MsgBox. Zpráva se objeví na serveru, protože kód, který píšete ve VB.NET, se spouští na serveru, a ne v prohlížeči u klienta. Pokud chcete ve stránce vyhazovat messageboxy, musíte do ní vypsat nějaký javascript, třeba přes volání Page.ClientScript.Register.... Elegantnější je ale použít validátory, které při chybném vstupu zruší prováděnou akci (vkládání záznamu) a zobrazí chybovou klášku v podobě červeného textu. Je lepší, než když na uživatele vyskočí 20 oken za sebou. Pokud vám chybí nějaký validátor, není nic jednoduššího, než si ho napsat (podědit třídu třeba od ServerValidator a overridnout metodu OnServerValidate tuším).

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Nejdřív k tomu MsgBoxu ,na stránkách ho nepoužívám. Tohle je kod z verze stranek kterou ladím a msgBoxy jsem si tam dal jenom proto, abych viděl že se mi tam ten kód zastaví a pak tam dám kód který potřebuji.

Ohledně toho omezování délky řetězců: na serveru je nainstalovaný SQL server 2000 a ten myslím funkci MAX u varcharu nepodporuje.

S tím validátorem máte pravdu, používám tam validátor aby se neodeslal prázdný formulář, ale něják mě nenapadlo mu zkusit nastavi maximální povolenou délku. Děkuji za nakopnutí:)

Jenom bych doplnil že si myslím že omezení maximální délky má smysl a to hlavně z důvodu:

1) Uživatel může chtít vložit do příspěvku okopírovaný text pomocí CTRL+C a lehce může přesáhnout maximální délku (oněch

8 000 znaků, vic mi myslím server u varcharu nepovolí, musel bych nastavit jako datový typ text což dělat nebudu).

2) Pokud uživatel bude kopírovat text, může se lehce stát že ho omylem zkopíruje ne do textboxu pro text ale třeba do kolonky pro jméno nebo předmět, pokud bude omezena délka, formulář se neodešle.

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