2012-04-15 1 views
0

Это similar question, но я столкнулся с проблемой для реализации представленного там решения.Dynamically Swap UserControl

В моем случае у меня есть две ссылки, Настройки пользователя, Space Settings и два UserControls, а именно, UserSettings.ascx, SpaceSettings.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"); 
    }*/ 

    } 

Это не работает. Результаты:

  • В первый раз посетить сеанс [ «Settings»] является нулем и UserControlUserSettings.ascx был загружен (справа) и Log от Page_Load метода UserSettings.ascx.cs был отображаются в окне вывода (справа).
  • Когда Space Settings ссылки была нажата, UserControlSpaceSettings.ascx был загружен (справа), но в окне вывода при печати пользователя (неправильно) также Бревна из Page_Load методов как UserSettings.ascx.cs и SpaceSettings.ascx.cs (UserSettings.ascx.cs 's Log is wrong).
  • Когда Настройки пользователя ссылка была нажата, то UserControlUserSettings.ascx был загружен (справа), но в окне вывода его печати Space (неправильно) также журналы из Page_Load методов как UserSettings.ascx.cs и SpaceSettings.ascx.cs (SpaceSettings.ascx.cs 's Log is wrong).
  • Я добавил два кнопки каждый из UserControls и когда, скажем, кнопка SpaceSettings.ascx была нажата она не обжиг события в классе бэка первый раз, но он делает, если он идет кликнул во второй раз. Кулаком является время регистрации Пользователь (Неправильно) и второй раз Космос (справа), то событие собирается уволить.
  • Когда я посещаю страницу второй раз, я вижу элемент управления, который был загружен последним. Так как Session["Settings"] не является нулевым. Я попытался установить это значение в Page_Unload и в методах OnUnload, но оба они не работают. Page_Unload нарушает работу системы, поскольку он вызывается каждый раз, а PostBack и OnUnload не вызывается atall.

Я пытался использовать 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 –

+0

@ Lex Ли почему я должен использовать вкладку jQuery в этом случае? Думаю, тогда мне нужно загрузить все содержимое на загрузку страницы, и это будет очень плохо. –

+0

Вкладки jQuery также поддерживают AJAX. –

ответ

0

я попробовал другой подход к решению мое требование, и это решает Перекачка UserControl но потом я столкнулся, что EventHandlers из Кнопки этих UserControls не были уволены в первый раз, но стреляли, если его дважды щелкнули.

Я задал этот вопрос на форуме ASP.NET. Но на мой вопрос никто не ответил. Но я очень старался найти решение, и я сделал это возможным. Проблема была в ID. Я опубликовал решение на этом форуме.

Вот link. Это может быть полезно для будущих пользователей.