2012-04-15 39 views
0

这是一个similar question,但我在实现该解决方案时遇到了麻烦。动态交换用户控件

在我来说,我有两个环节,用户设置空间设置和两个用户控件,即,UserSettings.ascxSpaceSettings.ascx

  • 用户第一次访问该页面时,他会看到用户设置
  • 根据点击这两个链接中的哪一个,PlaceHolder将交换UserControl

我所做的如下所示:

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"); 
    }*/ 

    } 

这是行不通的。结果是:

  • 在第一次访问会话[“设置”]是零和用户控件UserSettings.ascx已经被加载(右)和日志从UserSettings.ascx.csPage_Load方法已显示在输出窗口(右)。
  • 空间设置链接已被点击时,用户控件SpaceSettings.ascx已经被加载(右),但在输出窗口正在打印用户(错)也从两个UserSettings.ascx.csSpaceSettings.ascx.csPage_Load方法日志已被显示(UserSettings.ascx.cs的日志是错误的)。
  • 用户设置链接已被点击时,用户控件UserSettings.ascx已经被加载(右),但在输出窗口正在打印空间(错)也从两个UserSettings.ascx.csSpaceSettings.ascx.csPage_Load方法日志已被显示(SpaceSettings.ascx.cs的日志是错误的)。
  • 我已经添加了两个按钮到,如果被点击时候,说的SpaceSettings.ascx按钮被点击的时候,在不触发在支持类第一次的事件,但它确实它的用户控件中的每一个第二次。第一次登录用户(错误)和第二次空间(右)然后事件将被解雇。
  • 当我第二次访问页面时,我看到最后加载的控件。由于Session["Settings"]不为空然后。我试图在Page_UnloadOnUnload方法中将此值设置为null,但它们都不起作用。 Page_Unload正在打破系统,因为它每次都被调用,而PostBackOnUnload没有被调用。

我曾尝试使用Request["Settings"]代替Session["Settings"],但Request["Settings"] = "User"Request["Settings"] = "Space"是给我编译时错误:

Property or indexer 'System.Web.HttpRequest.this[string]' cannot be assigned to 

我该如何解决这个问题?

谢谢。

+0

您可能会等待其他人评论如何解决问题,但是是不是应该为这种客户端选项卡切换到jQuery? http://docs.jquery.com/UI/Tabs – 2012-04-15 11:54:30

+0

@Lex李为什么我应该在这种情况下使用jQuery选项卡?我想我必须加载页面加载的所有内容,这将是非常糟糕的。 – 2012-04-15 14:49:21

+0

jQuery选项卡也支持AJAX。 – 2012-04-16 01:33:50

回答

0

我已经尝试了不同的方法来解决我的要求,并解决了用户控件的交换,但后来我遇到的事件处理的用户控件按钮没有被烧制的第一时间,但如果点击两次,则会触发。

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

这里是link。这可能对未来的用户有用。