によると:
指定された指示に従って、ページ全体を更新しないでください。つまり、[戻る] ボタンが機能しないようにする必要があります (Internet Explorer の場合)。
と
サイドバー ツリー ビューはマスター ページにあり、コンテンツはここに表示されます。領域はコンテンツ ページです。
私の理解が正しければ、ツリー ビューの選択に基づいてコンテンツを動的にロードするページが 1 つだけ必要TreeView
なため、マスター ページにコントロールを配置する必要はないと思います。それで...なぜこれが重要なのですか?ツリー ビューをページに配置すると、完全な投稿を避けるために を使用できます。UpdatePanel
次のコードの出力

次のコードは、次の点をカバーしています。
コントロールはにTreeView
埋め込まれUserControl
、ASPX ページに配置されます (左側)
メニュー コントロールは、選択したノードが変更されるたびに発生するイベントを公開します。このイベントは ASPX ページで処理され、ページの右側でのユーザーの選択に応じてユーザー コントロールを動的にロードします。一度に 1 つのコンテンツのみがロードされます。
コントロールは に埋め込まれているUpdatePanel
ため、ページを変更したり、ブラウザの戻るボタンに影響を与えたりすることはありません
注: ユーザー コントロールは、ポスト バック間で状態を維持します。
(これが最善の方法であるかどうかはわかりません。おそらく ajax のみを使用して解決策を見つけ、邪悪な更新パネルの使用を避けることができますが、確かにこれはそれを行う方法です)
投稿のサイズを小さくするためにコードを単純化しようとします。一方のユーザー コントロールのコードを投稿するだけです。
ASCX メニュー
<asp:TreeView ID="TreeView1" runat="server" onselectednodechanged="Unnamed2_SelectedNodeChanged">
<Nodes>
<asp:TreeNode Text="link1" />
<asp:TreeNode Text="link2" />
</Nodes>
<SelectedNodeStyle Font-Bold="True" Font-Italic="True" />
</asp:TreeView>
ASCX メニュー コード ビハインド
public event Action<string> MenuChanged = delegate { };
protected void Unnamed2_SelectedNodeChanged(object sender, EventArgs e)
{
this.MenuChanged(this.TreeView1.SelectedNode.Text);
}
ASPX
<asp:ScriptManager runat="server" ID="sm" />
<asp:UpdatePanel runat="server" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:HiddenField runat="server" ID="currentControl" />
<table border="0" cellpadding="0" cellspacing="0" width="90%" align="center">
<tr>
<td style="width:50%; background-color: Silver">
<menu:TreeViewMenu runat="server" ID="myTreeViewMenu" OnMenuChanged="myTreeViewMenu_MenuChanged" />
</td>
<td style="width:50%; background-color: Aqua">
<p>Result:</p>
<asp:Panel runat="server" ID="myPanel">
</asp:Panel>
<asp:Label ID="lblMessage" runat="server" />
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>
ASPX コードビハインド
protected void Page_Init(object sender, EventArgs e)
{
if (this.IsPostBack)
{
var cc = this.Request.Form["currentControl"];
if (!string.IsNullOrWhiteSpace(cc))
{
var uc = this.LoadControl(this.Server.HtmlDecode(cc));
this.myPanel.Controls.Add(uc);
}
}
}
protected void myTreeViewMenu_MenuChanged(string e)
{
this.myPanel.Controls.Clear();
switch (e)
{
case "link1":
var cc1 = "~/Content1.ascx";
this.currentControl.Value = this.Server.HtmlEncode(cc1);
var uc1 = this.LoadControl(cc1);
this.myPanel.Controls.Add(uc1);
this.lblMessage.Text = "Updated from: link1";
break;
case "link2":
var cc2 = "~/Content2.ascx";
this.currentControl.Value = this.Server.HtmlEncode(cc2);
var uc2 = this.LoadControl(cc2);
this.myPanel.Controls.Add(uc2);
this.lblMessage.Text = "Updated from: link2";
break;
default:
this.lblMessage.Text = "Updated from default: " + e;
break;
}
}
ASCX
<h1>Content 1</h1>
<asp:TextBox runat="server" ID="txt" />
<asp:Button Text="Process data..." runat="server" OnClick="button_Click" />
<asp:Button Text="Just post" runat="server" />
<asp:Label ID="lblMessage" runat="server" />
ASCX コード ビハインド
protected void button_Click(object sender, EventArgs e)
{
this.lblMessage.Text = this.txt.Text;
}
このコードをコピーして貼り付けて自分でテストするだけで、うまくいくはずです