Nové server controls: MultiView, Wizard a Substitution

Naši prohlídku světa Whidbey započneme třemi jednoduchými ovládacími prvky.

MultiView

Pro začátek něco lehčího. Řada aplikací - alespoň mých určitě - obsahuje stránky, které sestávají z několika částí, u kterých je viditelná vždy právě jenom jedna. Ať už se jedná o obdobu "záložek", nebo nějakého průvodce... Ve verzi 1.x se tato situace řeší tak, že se pod sebe naskládá větší množství prvků asp:Panel, všem se nastaví visible="False" a na straně serveru se programově zajistí, že se zviditelní právě jeden.

V případě verze 2.0 jest v obdobné situaci použíti asp:MultiView. Ten obsahuje něco prvků asp:View, z nichž právě jeden je aktivní (viditelný). Kterému z prvků bude svěřena tato výsada jest specifikovati vlastností ActiveViewIndex.

Jednoduchý příklad použití jest zde:

<%@ Page Language="VB" %>

<script runat="server">
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        Me.MultiView1.ActiveViewIndex = Int32.Parse(Me.DropDownList1.SelectedValue)
    End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>MultiView example</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <p>
                <asp:DropDownList ID="DropDownList1" runat="server">
                    <asp:ListItem Value="0" Selected="true">Tab #1</asp:ListItem>
                    <asp:ListItem Value="1">Tab #2</asp:ListItem>
                    <asp:ListItem Value="2">Tab #3</asp:ListItem>
                </asp:DropDownList>
                <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
            </p>
            <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">
                <asp:View ID="ViewTab1" runat="server">
                    Tab 1
                </asp:View>
                <asp:View ID="ViewTab2" runat="server">
                    Tab 2
                </asp:View>
                <asp:View ID="ViewTab3" runat="server">
                    Tab 3
                </asp:View>
            </asp:MultiView>
        </form>
    </body>
</html>

Wizard

Takový prvek MultiView představuje malý krůček pro člověka, ale velký krok pro celý programátorský národ. Ne přímou svou samostatnou existencí, leč skutečností, že dal vzniknouti mnohem schopnějšímu prvku jménem asp:Wizard.

Je doporučeno, aby složitější formuláře byly realizovány formou průvodce, tedy několika na sebe navazujících kroků. Cílem je, aby uživatel nebyl hned na první pohled zmaten desítkami složitých formulářových prvků, ale aby se předmětné zmatení dostavovalo postupně, v malých dávkách. Znáte to: pokud žábu hodíte do vařící vody, vyskočí z hrnce. Pokud ji vložíte do studené vody a tu budete pomalu zahřívat, nechá se klidně uvařit. Se žábami jsem to nezkoušel, s uživateli ano (želbohu toliko metaforicky): Pokud už se proklikají do šestého kroku průvodce, je jim zatěžko to vzdát - zvláště když se jim prozíravě zatají že před nimi je dalších pět :-)

Napsat dostatečně komfortního průvodce, který dovolí přepínat se korektně pomocí tlačítek "Předchozí" a "Další", neřku-li jednotlivé kroky vyplňovat na přeskáčku (je-li to žádoucí) není prostředky ASP.NET 1.x rozhodně triviální. Prostředky 2.0 ano. Použijete prvek asp:Wizard a podobným způsobem jako u MultiView nadefinujete jednotlivé kroky průvodce (VS.NET 2005 vám dokonce přičinlivě nabídne vhodné GUI pro tuto činnost).

Pak už zbývá toliko ošetřit událost FinishButtonClick, tedy dokončení průvodce. Dalšími probíhajícími kroky netřeba se zaobírati.

Z důvodu jeho rozsáhlosti ukázkový kód není součástí článku, najdete ho v přiloženém souboru příkladů.

Substitution

Předpokládám, že většina programátorů jest obeznámena s mechanismem cacheování v ASP.NET 1.x (patříte-li mezi onu menšinu, stručné pojednání na toto téma jest nalézti příkladně mezi staršími články na tomto serveru).

Mnohdy vyhoví prostý zápis direktivy @OutputCache a cacheování celé stránky. Často je ale třeba cache engine poněkud omezit v rozletu a ukládat jenom něco. Toho jest dosáhnouti ve verzi 1.x tím, že se část stránky mající podléhat uložení do cache realizuje co web user control a cacheuje se ten, zatímco stránka jako taková se vykoná vždy znovu.

To je řešení elegantní, leč poněkud nepraktické v případě, že ono shora zmíněné něco je prakticky celá stránka, s výjimkou jedné či několika malých částí. Například z důvodu požadavku marketingového oddělení, že na webových stránkách prostě musí být aktuální čas ;-)

V takových případech je v nové verzi k dispozici ovládací prvek asp:Substitition. Má jediný smysluplný parametr, kterým je MethodName: název metody, která se vykoná při každém požadavku, a jejíž výsledek bude vložen do jinak cacheované stránky na místo patřičného prvku Substitution.

Vizte následující příklad:

<%@ Page Language="VB" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<script runat="server">
    
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        Me.Label1.Text = System.DateTime.Now.ToString()
    End Sub
    
    Shared Function RefreshSubstitution(ByVal Context As System.Web.HttpContext) As String
        Return System.DateTime.Now.ToString()
    End Function
    
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Substitution</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:Substitution ID="Substitution1" runat="server" MethodName="RefreshSubstitution" />
                <br />
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            </div>
        </form>
    </body>
</html>

Celá stránka má povoleno cacheování výstupu na dobu jedné minuty, jak jest vyzkoušeti na obsahu prvku Label1, který jest v Page_Load naplněn aktuálním časem, ale nejčastěji jednou za minutu. Oproti tomu prvek Substitution1 je voláním metody RefreshSubstitution aktualizován při každém požadavku, cache necache.

Můžete si stáhnout zdrojové kódy k tomuto článku. K jejich rozběhnutí budete potřebovat webový server podporující Microsoft .NET Framework 2.0 Beta 2.
  • Altairis
  • Nemesis
  • Microsoft MVP
  • IIS
  • ASP.NET