Одна визуальная веб-часть Несколько раз на Странице (проблемы с сохранением состояния персонализации)
-
16-10-2019 - |
Вопрос
У меня есть требование для создания бюджетного отчета, который содержит одни и те же ключевые поля для 6 разных категорий.Я написал визуальную веб-часть, которая извлекает listitem для каждого раздела и отображает данные вместе с кнопкой редактирования.В веб-части также есть пользовательское свойство для хранения типа бюджета:
public class ProjectDetailsView : WebPart
{
// Visual Studio might automatically update this path when you change the Visual Web Part project item.
private const string _ascxPath = @"~/_CONTROLTEMPLATES/SpecialProjectsProjectList/ProjectDetailsView/ProjectDetailsViewUserControl.ascx";
[Personalizable(), WebBrowsable]
public String BudgetType { get; set; }
protected override void CreateChildControls()
{
ProjectDetailsViewUserControl control = Page.LoadControl(_ascxPath) as ProjectDetailsViewUserControl;
//Control control = Page.LoadControl(_ascxPath);
if (control != null)
{
control.WebPart = this;
}
Controls.Add(control);
}
}
}
Я добавлял этот визуальный фрагмент 6 раз на одной и той же странице.Кажется, что только первый элемент управления фактически сохраняет пользовательское свойство.Вероятно, это ошибка в коде, или у вас не может быть одного и того же веб-раздела несколько раз на одной странице?
Я не хочу тратить часы на отладку, если кто-то уже знает, что мне нужно создать отдельный элемент управления для каждого раздела.Большое спасибо!
Решение 2
Теперь я понял, почему я не смог сохранить пользовательские свойства в графическом интерфейсе.Я закрывал текущий веб-объект из SPContext.Очевидно, что этого не следует делать, поскольку это обрабатывается фреймворком.Как только я удалил свой текущий сайт.Dispose() из моего finally в пользовательском элементе управления webpart я смог правильно сохранить пользовательские свойства.
Другие советы
Если вы собираетесь размещать веб-часть на странице несколько раз, каждый экземпляр веб-части должен иметь уникальный идентификатор.Вот пример того, что вы могли бы сделать:
control.ID = this.ID + "_ProjectDetailsControl";