根据:
根据给定的说明,不应刷新整个页面,或者换句话说,后退按钮不应该工作(在 Internet Explorer 中)。
和
侧边栏树视图在母版页中,内容在此处区域是内容页
如果我的理解是正确的,我认为您不需要将TreeView
控件放在母版页中,因为您只希望一个页面根据树视图的选择动态加载内容。所以...为什么这很重要?好吧,如果您将树视图放在页面中,则可以使用 anUpdatePanel
来避免完整的帖子。
以下代码的输出
![在此处输入图像描述](https://i.stack.imgur.com/alpdZ.png)
以下代码涵盖了以下几点:
一个TreeView
控件嵌入在UserControl
一个 ASPX 页面中(左侧)
菜单控件公开了一个事件,该事件在所选节点更改时引发,此事件在 ASPX 页面中处理,以根据页面右侧的用户选择动态加载用户控件,一次仅加载一个内容。
控件嵌入其中,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;
}
}
澳交所
<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;
}
您可以简单地复制粘贴此代码以自己测试,这应该可以