Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

NForms pro ASP.NET

18.15 - 28. prosince 2007 | ASP.NET 2.0

Do vydání kompletního frameworku Nette je ještě asi daleko, ale to nevadí. My na ASP.NET bychom z něj stejně žádný užitek neměli. Tedy vlastně, proč by ne?

Vždyť Nette je protkáno spoustou skvělých nápadů. A když jde o skvělé nápady proč je nezhmotnit že? :) Ukradl jsem Davidovo mentální bohatství a jal se implementovat NForms v C#. Jako inspirace mi sloužila skvělá přednáška o Nette frameworku. Zatím jsem ve fázi (po dvou dnech koukání na přednášku a přerušovaného psaní), kdy se formuláře hezky generují. To je tak čtvrtina úspěšné cesty, doufám.

Nahlížíme pod pokličku

Základem je něco, jako NHtml, třída HtmlElement, která se stará o generování kódu. Syntaxe částečně vychází z NHtml, ale vzhledem k rozdílnosti jazyků, jsem některé věci musel řešit odlišně. V podstatě jsem zde narážel na limity C# jako staticky typovaného jazyka.

var input = new HtmlElement(
  "input",
  new { Name = "name", Id = "nameInput", Type = InputType.Text },
  HtmlElement.SelfClosing
);

V ukázce je vytvoření elementu input včetně některých atributů. Atributy se předávají pomocí vlastností anonymní třídy. Vygenerovaný kód vypadá následovně:

<input name="name" id="nameInput" type="Text" />

Další vlastnosti lze nastavovat přes indexer následujícím způsobem:

input["MaxLength"] = 25;

Dále pak má metody pro přidávání potomků, nastavování textu nebo HTML, přidávání/odebírání CSS třídy a samotné renderování.

Na tomto základě pak vyrůstá formulářová nadstavba. Snažil jsem se co nejvíce přiblížit API PHPčkovému vzoru, ale práce je v tomto směru velice těžká. Zlatej Microsoft a OpenXML ;) Vzorem je pár zachycených řádků na přednášce (David pekelně rychle mačká PgDown/PgUp) a vlastní fantazie ohledně zbytku.

No prozatím jsem se dostal do následujícího stavu. Následná akce řadiče:

[ControllerAction]
public void Index() {
  var genres = new ListItem[] {
    new ListItem { Text = "muž", Value = 1 },
    new ListItem { Text = "žena", Value = 2 }
  };

  Form form = new Form();
  form.AddText("name", "Jméno:", 20, 50);
  form.AddText("email", "E-mail", 20, 255);
  form.AddHidden("skryte").SetValue("nějaká hodnota - skrytá");
  form.AddRadio("pohlavi", "Pohlaví:", genres);
  form.AddButton("submit", "Odeslat");
  Form = form;
  RenderView("Index");
}

ve spojení se šablonou v pohledu:

<form method="post" action="">
<div style="display:none"><%=Form["skryte"].Control %></div>
<fieldset>
  <legend>Osobní údaje</legend>
<table>
<tr>
  <td><%=Form["name"].Label %></td>
  <td><%=Form["name"].Control %></td>
</tr>
<tr>
  <td><%=Form["email"].Label %></td>
  <td><%=Form["email"].Control %></td>
</tr>
<tr>
  <td><%=Form["pohlavi"].Label %></td>
  <td><%=Form["pohlavi"].Control %></td>
</tr>
<tr>
  <td></td>
  <td><%=Form["submit"].Control %></td>
</tr>
</table>
</fieldset>
</form>

Vygeneruje následující kód:

<form method="post" action="">
<div style="display:none">
<input name="skryte" type="Hidden" value="nějaká hodnota - skrytá" />
</div>
<fieldset>
  <legend>Osobní údaje</legend>
<table>
<tr>
  <td><label for="name">Jméno:</label></td>
  <td><input name="name" id="name" type="Text" size="20" maxlength="50" /></td>
</tr>
<tr>
  <td><label for="email">E-mail</label></td>
  <td><input name="email" id="email" type="Text" size="20" maxlength="255" /></td>
</tr>
<tr>
  <td><label>Pohlaví:</label></td>
  <td>
    <input name="pohlavi" id="pohlavi0" type="Radio" value="1" />
    <label for="pohlavi0">muž</label><br />
    <input name="pohlavi" id="pohlavi1" type="Radio" value="2" />
    <label for="pohlavi1">žena</label><br />
  </td>
</tr>
<tr>
  <td></td>
  <td><input name="submit" type="Button" value="Odeslat" /></td>
</tr>
</table>
</fieldset>
</form>

A to je zatím vše. A proč to vlastně dělám a nepokračuju v seriálu o Gryphoonu? Inu, vlastně pokračuju, pokračuju…

Tagy: , ,

Autor: Aleš Roubíček | Web feed s komentáři | Přidej komentář | del.icio.us | Linkuj!

Komentáře

  1.  

    Martin

    19.33 - 28. prosince 2007 | #

    Proč se všichni snaží následovat vůdce dgx? To opravdu není na světě nic lepšího, než ty jeho virtuální výplody? Opravdu jste nikdy na formuláře neviděl nic šikovnějšího? Nechápu… Snažit se přepisovat pár pochybných nápadů z jedné trapné přednášky? Asi fakt stačí udělat hype kolem chcíplé krysy a desítky lidí se na ni budou těšit a když ji jednoho dne na vteřinu ukážu, začnou dělat sádrové napodobeniny.

  2.  

    Aleš Roubíček

    20.00 - 28. prosince 2007 | #

    [1] Martin Přesně tak – neviděl…

  3.  

    veena

    01.06 - 29. prosince 2007 | #

    rarouš, zdrojáky NForm sice na webu teď nejsou, ale kdybys požádal, tak se určitě najdou lidi, co ti je zašlou. Taky se mi jedny válejí na disku ;-) I když by ti pak odpadla ta zábavná detektivní práce luštění kódu z videa ;-)

    Já dosud neviděl nic lepšího na formuláře než newforms v djangu.

  4.  

    Aleš Roubíček

    08.26 - 29. prosince 2007 | #

    Tak zase jsem to nechtěl úplně zkopírovat, ta zábava za to stojí. :)

  5.  

    David Grudl

    11.12 - 29. prosince 2007 | #

    Hezké :-) Měl jsi napsat, poslal bych zdroják.

    [3] veena můžeš prosím stručně popsat ty newforms, případně v čem se od tohoto řešení liší?

  6.  

    David Grudl

    11.19 - 29. prosince 2007 | #

    p.s. Martin je můj největší fanda :-)

  7.  

    Aleš Roubíček

    12.04 - 29. prosince 2007 | #

    [6] dgx Ten člověk tě musí upřímně milovat, tolik něžných slov a kunstruktivní kritiky jsem dlouho nečetl :D

  8.  

    Traged

    14.58 - 30. prosince 2007 | #

    V cem je toto lepsi od standartniho zapisu frameworku 2.0? Je to akorat min prehledny a casem bys urcite narazil na spousta veci co si nedomyslel. Framework 2.0 je frameworkem sam o sobe, mozna, ze jinej neni prave proto, ze se oklikou vsichni stejne dostanou k tomu samimu zakladu. Rozhodne ta tvoje ukazka je dost zoufala, nenasel sem tam nic lepsiho, ba naopak.

  9.  

    Aleš Roubíček

    17.28 - 30. prosince 2007 | #

    [8] Traged Za poslední rok jsem naspal v asp.net nespočet formulářů. Pramálo z nich používá asp.net controly, protože v daném scénáři byly nepoužitelné. Došel jsem k jedinému závěru: Mně webforms model nevyhovuje, proto si za něj píšu náhradu. Pokud se ti to nelíbí, nepoužívej to (vlastně ani nemůžeš, když to není uvolněný). To je vše, co ti k tomu mohu říct.

  10.  

    Tomik

    20.49 - 30. prosince 2007 | #

    [9] rarouš Mě se naopak ten koncept líbí. Už od té doby, co jsem jej viděl na té přednášce od Davida. :)

    Přestože mým #1 jazykem pro webové aplikace je php (tedy spíše využiji toho Davidova řešení), tak se sem tam se k ASP.NET dostanu (neb C# je zas mojí #1 na desktopu :), a tak bych se chtěl zeptat, jestli to uvolníš, když píšeš v [9] rarouš, že to není uvolněné. :)

    Tj. jestli až to dokončíš, to hodíš pod nějakou rozumnou licenci, nebo to zůstane jen jako „návod“ ve formě článků.

  11.  

    Aleš Roubíček

    21.24 - 30. prosince 2007 | #

    [10] Tomik rád bych to hotové uvolnil :) Nejspíš pod MS-PL jako všechno :)

  12.  

    veena

    22.07 - 4. ledna 2008 | #

    [5] dgx Viz jak jsem se snažil popsat zde ve 13 komentáři http://weblog.ronnieweb.net/?…

    Na konci jsem uvedl odkaz na dokumentaci o newforms, kterou stojí za to přečíst.

    Pythonisti to maj taky jednodušší, že se jim nemůže do requestu (GET, POST…) dostat pole jako nám phpkářum.

  13.  

    Aleš Roubíček

    23.29 - 4. ledna 2008 | #

    Ten je docela zajímavej, dík za odkaz :)

Místo pro tvůj názor

Povinné je jméno a komentář, z e-mailu se rozpoznají Gravatary.
Komentář je formátován pomocí Texy! syntaxu.
Například: **tučný text**, *kurzíva*, "text odkazu":adresa.
Internetové adresy jsou převáděny na odkazy.
Na komentáře se můžete odkazovat pomocí [číslo komentáře].

Nový komentář