Asp.net 动态交换用户控件

Asp.net 动态交换用户控件,asp.net,user-controls,Asp.net,User Controls,这是一个很好的解决方案,但是我在实现上面显示的解决方案时遇到了麻烦 在我的例子中,我有两个链接,用户设置,空间设置和两个用户控件,即,UserSettings.ascx,SpaceSettings.ascx 当用户第一次访问页面时,他将看到用户设置 根据单击这两个链接中的哪一个,占位符将交换用户控件 我所做的工作如下所示: public partial class SiteSettings : RefreshDitectedPage { protected void Page

这是一个很好的解决方案,但是我在实现上面显示的解决方案时遇到了麻烦

在我的例子中,我有两个链接,用户设置空间设置和两个用户控件,即,
UserSettings.ascx
SpaceSettings.ascx

  • 当用户第一次访问页面时,他将看到用户设置
  • 根据单击这两个链接中的哪一个,占位符将交换用户控件
我所做的工作如下所示:

public partial class SiteSettings : RefreshDitectedPage {   

    protected void Page_Load(object sender, EventArgs e) {

    }

    protected override void OnInit(EventArgs e) {
        base.OnInit(e);
        string key = Session["Settings"] as String;
        System.Diagnostics.Debug.WriteLine(key);
        if (key == null) {
        Session["Settings"] = "User";           
        AddUserSettings();
        } else {
        if (key.Equals("User")) {
            AddUserSettings();
        } else {
            AddSpaceSettings();
        }
        }
    }


    protected void SettingsLink_OnCommand(object sender, CommandEventArgs commandEventArgs) {
        switch (commandEventArgs.CommandName) {
        case "User":
            Session["Settings"] = "User";           
            AddUserSettings();
            break;

        case "Space":
            Session["Settings"] = "Space";
            AddSpaceSettings();
            break;
        }
    }

    private void AddUserSettings() {
        AddSettings(LoadControl("~/UserControls/UserSettings.ascx") as UserSettings);
    }

    private void AddSpaceSettings() {
        AddSettings(LoadControl("~/UserControls/SpaceSettings.ascx") as SpaceSettings);
    }

    private void AddSettings(UserControl control) {
        SettingsPlaceholder.Controls.Clear();
        SettingsPlaceholder.Controls.Add(control);
    }

    /*protected void Page_Unload(object sender, EventArgs e) {
        Session["Settings"] = null;
        System.Diagnostics.Debug.WriteLine("Unload called");
    }*/

    }
这是行不通的。结果是:

  • 第一次访问时,会话[“设置”]为空,并且已加载用户控件
    用户设置.ascx
    (右)并从
    页面加载
    用户设置方法记录。输出窗口(右)中显示了ascx.cs
  • 单击空间设置链接后,已加载用户控件
    SpaceSettings.ascx(右),但在输出窗口中它正在打印用户(错误)此外,还显示了
    UserSettings.ascx.cs
    SpaceSettings.ascx.cs
    两种方法的
    页面加载的日志(
    UserSettings.ascx.cs
    的日志错误)
  • 单击用户设置链接后,已加载用户控件
    UserSettings.ascx(右),但在输出窗口中是打印空间(错误)此外,还显示了
    UserSettings.ascx.cs
    SpaceSettings.ascx.cs
    方法的
    页面加载的日志(
    SpaceSettings.ascx.cs
    的日志错误)
  • 我在每个用户控件中添加了两个按钮,当点击
    SpaceSettings.ascx
    按钮时,它不会第一次在后台类中触发事件,但如果是第二次点击,它会触发。第一次记录用户(错误)和第二次记录时间间隔(正确)时,事件将被触发
  • 当我第二次访问页面时,我看到的是上次加载的控件。由于
    会话[“设置”]
    不为空。我已尝试在
    Page\u Unload
    OnUnload
    方法中将此值设置为null,但这两种方法都不起作用
    Page\u Unload
    正在破坏系统,因为它每次都被调用,而
    PostBack
    OnUnload
    没有被调用
我尝试使用
Request[“Settings”]
而不是
Session[“Settings”]
,但是
Request[“Settings”]=“User”
Request[“Settings”]=“Space”
给了我编译时错误:

Property or indexer 'System.Web.HttpRequest.this[string]' cannot be assigned to 
我怎样才能解决这个问题


谢谢。

我尝试了一种不同的方法来解决我的需求,这解决了用户控件的交换问题,但后来我发现用户控件的按钮的事件处理程序不是第一次被触发的,而是在被点击两次时被触发的

我在ASP.NET论坛上问过这个问题。但是没有人回答我的问题。但我一直在努力寻找解决办法,最后我使之成为可能。问题出在ID上。我已经在那个论坛上发布了解决方案


这是你的电话号码。这对未来的用户可能很有用。

您可能会等待其他人对如何解决该问题发表意见,但现在不是切换到jQuery以获得此类客户端选项卡的时候了吗@Lex Li在这种情况下为什么要使用jQuery选项卡?我想我必须在页面加载中加载所有内容,这将非常糟糕。jQuery选项卡也支持AJAX。