Это 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»] является нулем и UserControl
UserSettings.ascx
был загружен (справа) и Log отPage_Load
методаUserSettings.ascx.cs
был отображаются в окне вывода (справа). - Когда Space Settings ссылки была нажата, UserControl
SpaceSettings.ascx
был загружен (справа), но в окне вывода при печати пользователя (неправильно) также Бревна изPage_Load
методов какUserSettings.ascx.cs
иSpaceSettings.ascx.cs
(UserSettings.ascx.cs
's Log is wrong). - Когда Настройки пользователя ссылка была нажата, то UserControl
UserSettings.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
Как я могу решить эту проблему?
Спасибо.
Возможно, вы можете подождать, пока другие не захотят прокомментировать, как его решить, но не пора ли переключиться на jQuery для таких вкладок на стороне клиента? http://docs.jquery.com/UI/Tabs –
@ Lex Ли почему я должен использовать вкладку jQuery в этом случае? Думаю, тогда мне нужно загрузить все содержимое на загрузку страницы, и это будет очень плохо. –
Вкладки jQuery также поддерживают AJAX. –