Here's the update panel alternative examplified
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SampleCascade.aspx.cs" Inherits="Lunch.SampleCascade" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" ID="AjaxScriptManager" EnablePartialRendering="True"></asp:ScriptManager>
<div>
<asp:UpdatePanel runat="server" ID="UpdPnl" UpdateMode="Always">
<ContentTemplate>
<div>
<label>Country</label>
<asp:DropDownList runat="server" ID="CountryDropDown" AutoPostBack="True" OnSelectedIndexChanged="CountryDropDownSelectedIndexChanged">
<asp:ListItem Value="dk" Selected="True">Denmark</asp:ListItem>
<asp:ListItem Value="ca">Canada</asp:ListItem>
</asp:DropDownList>
</div>
<div>
<label>City</label>
<asp:DropDownList runat="server" ID="CityDropDown" AutoPostBack="True" OnSelectedIndexChanged="CityDropDownSelectedIndexChanged">
</asp:DropDownList>
</div>
<asp:Label runat="server" ID="Feedback"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
and with code behind
using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
namespace Lunch
{
public partial class SampleCascade : System.Web.UI.Page
{
private Dictionary<string, HashSet<string>> _cities = new Dictionary<string, HashSet<string>>();
protected void Page_Init(object sender, EventArgs e)
{
_cities.Add("dk", new HashSet<string>(new []{ "Copenhagen", "Aalborg", "Odense" }));
_cities.Add("ca", new HashSet<string>(new [] { "Ottawa", "Toronto", "Charlottetown" }));
}
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
LoadCities(CountryDropDown.SelectedValue);
}
protected void CountryDropDownSelectedIndexChanged(object sender, EventArgs e)
{
var ctry = (DropDownList) sender;
LoadCities(ctry.Items[ctry.SelectedIndex].Value);
Feedback.Text = "Loaded cities for " + ctry.Items[ctry.SelectedIndex].Text;
}
protected void CityDropDownSelectedIndexChanged(object sender, EventArgs e)
{
var city = (DropDownList) sender;
ListItem selected = city.Items[city.SelectedIndex];
if (selected.Value == "0") return;
Feedback.Text = "City selected: " + selected.Text;
}
private void LoadCities(string country)
{
CityDropDown.Items.Clear();
foreach (var itm in _cities[country])
{
CityDropDown.Items.Add(new ListItem(itm, itm.ToLower()));
}
CityDropDown.Items.Insert(0, new ListItem("Select", "0"));
}
}
}