AJAX
AJAX Toolkit
Børre Stenseth
Moduler>AJAX>AJAX i .NET>Toolkit

AJAX i .Net med Toolkit

Hva
AJAX i .NET, med toolkit

I dette eksempelet bruker vi de innebygde Ajaxmekanismene i .Net. Det vil si at vi bruker et UpdatePanel og overlater til .Net å lage nødvendig Javascriptkode.

I tillegg bruker vi Ajax Toolkit [1] . Her finner du alt du trenger for å laste ned AJAX Toolkit og du finner demonstrasjoner og instruksjonsvidoer.

Vi bruker AJAX Toolkit til å legge til en utvidelse av egenskapene til bildet som viser fram dikteren og det panelet som viser fram sonetten.. Du kan sammenligne denne løsningen med den som er beskrevet i modulen Enkel og i Håndlaget. Det er i prinsipp det samme problemet som løses.

Du kan teste det herhttp://donau.hiof.no/borres/dn/AjaxShake3/Default.aspx

I designeren i Visual Studio har vi laget følgende side:

<%@ Page Language="C#" AutoEventWireup="true" 
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register assembly="AjaxControlToolkit" 
             namespace="AjaxControlToolkit" tagprefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>WS</title>
    <script type="text/javascript">
    
      function pageLoad() {
      }
    
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <!-- a big panel to give us room to move in -->
    <asp:Panel ID="PanelBig" Height="800px" Width="600px" runat="server">
    
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        
        <h1>William Shakespeare</h1>
        <p>Henter sonetter inn i et UpdatePanel som kan flyttes.
           Bildet kan også flyttes. 
           <asp:Image ID="Image1" runat="server" ImageUrl="~/ws.jpg" />
        </p>
        
        <cc1:DragPanelExtender ID="Image1_DragPanelExtender" runat="server" 
            DragHandleID="Image1" Enabled="True" TargetControlID="Image1">
        </cc1:DragPanelExtender>
         <div>
        <asp:TextBox ID="TextBoxSonetteNr" runat="server">18</asp:TextBox>
        <asp:Button ID="ButtonGetSonette" runat="server" Text="Hent sonnete" 
            onclick="ButtonGetSonette_Click" />
        </div>
        
        <asp:RangeValidator ID="RangeValidator1" runat="server" 
            ControlToValidate="TextBoxSonetteNr" Display="Dynamic" 
            ErrorMessage="Tall i området" MaximumValue="154" MinimumValue="1" 
            Type="Integer"></asp:RangeValidator>
        <div>
        <asp:Label ID="Label1" runat="server" Text=" [1..154]">
        </asp:Label>
        </div>
        
        <!-- Wrap the  update panel  to make it stick on update -->
        <asp:Panel ID="Updateholder" runat="server">
      
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Panel ID="Panel1"   runat="server" 
                           BackColor="#E5E5E5" BorderColor="#000099" 
                    BorderStyle="Solid" Height="400px" Width="400px" 
                    Wrap="False">
                    
                    <asp:Panel ID="Panel2" runat="server">
                        <asp:Label ID="LabelHeader" runat="server" Text="" 
                                 Font-Bold="True" ForeColor="Red">
                         </asp:Label>
                    </asp:Panel>
                 
                 
                 <asp:Label ID="LabelDikt" runat="server" Font-Bold="True" 
                    ForeColor="#000000" Text=""></asp:Label>
                </asp:Panel>
            
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="ButtonGetSonette" 
                                           EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
        
        </asp:Panel>
        
        
        <cc1:DragPanelExtender ID="Updateholder_DragPanelExtender" runat="server" 
            DragHandleID="Updateholder" Enabled="True" TargetControlID="Updateholder">
        </cc1:DragPanelExtender>
        
    <p>Studer kildekoden.</p>
    <p><a href="javascript:history.back()">Tilbake</a></p>
    
    </asp:Panel> <!-- big -->
    </form>
    </body>
</html>

Det er lagt til extensions (DragPanelExtender) for ett bilde (Image1) og et panel (Updateholder). Merk dessuten panelet: PanelBig, som har som oppgave å ekspandere "sidearealet" slik at vi har litt plass å flytte på.

Koden som går bak er slik

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml;
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void ButtonGetSonette_Click(object sender, EventArgs e)
    {
        // get parameter
        String S = TextBoxSonetteNr.Text;
        int sonetteNum;
        try
        {
            sonetteNum = Convert.ToInt16(S);
        }
        catch (Exception ex)
        {
            sonetteNum = 1;
        }
        sonetteNum = Math.Min(Math.Max(1, sonetteNum), 154);
        // get the XML-file with sonnetes
        string physicalPath = HttpContext.Current.Server.MapPath(".").ToString();
        String filename = physicalPath + "\\App_Data\\sonnetes.xml";
        XmlDocument doc = new XmlDocument();
        String Res="";
        String Header = "";
        try
        {
            doc.Load(filename);
            XmlNodeList list = doc.GetElementsByTagName("sonnet");
            XmlElement p = (XmlElement)list.Item(sonetteNum - 1);
            XmlNodeList lines = p.GetElementsByTagName("line");
            XmlNodeList heads = p.GetElementsByTagName("id");
            Header = "<h3>Nr: " + heads.Item(0).InnerText + "</h3>\r\n";
            foreach (XmlNode n in lines)
            {
                Res += "<div>" + n.InnerText + "</div>\r\n";
            }
        }
        catch (Exception ex)
        {
            Res="Could not find a sonnette: " + ex.Message;
        }
        // Update results
        LabelDikt.Text = Res;
        LabelHeader.Text = Header;
    }
}

Som du ser av løsningen er forbedringspotensialet definivt tilstede. Hva med et penere panel for selve diktet ?

Referanser
Shakespeare:
https://svn.hiof.no/svn/psource/Csharpsites/AjaxShake3
Vedlikehold

B. Stenseth mars 2008

(Velkommen) Moduler>AJAX>AJAX i .NET>Toolkit (Histogram)