Когда сохраняются пользовательские свойства веб-части?
-
16-10-2019 - |
Вопрос
У меня есть веб-часть, которая содержит ряд пользовательских свойств.Пользователь не должен устанавливать только одно из этих свойств клиента.Это свойство является значением int, представляющим уникальный идентификатор.
Я хочу установить этот уникальный идентификатор при первом создании веб-части.Конечно, это означает, что если идентификатор равен 0, я присваиваю ему новое значение, которое увеличивается каждый раз, когда используется значение.
Однако значение в свойстве вообще не сохраняется.Оно доступно на время нахождения веб-части на странице, при обновлении значение будет присвоено следующему уникальному значению.(На самом деле уникальный идентификатор - это не что иное, как автоматически введенный номер)
Свойство выглядит примерно так:[Personalizable()] public int InstanceID { получить { вернуть _instanceId;} установить { _instanceId = значение;} }
Само свойство работает нормально, когда оно задается методом applychanges редакторской части.Я попробовал несколько примеров с GetLimitedWebPartManager, но у меня возникает исключение из-за того, что веб-части нет на странице.Большинство из этих примеров используются для изменения произвольной веб-части, суть здесь в том, что я хочу изменить свойство веб-части при ее загрузке.
Итак, мой вопрос в том, когда будут сохранены свойства веб-части и как?Есть ли возможность сохранить пользовательские свойства веб-части изнутри веб-части?
У кого-нибудь есть идеи, что я делаю не так?
[Обновление] Спасибо за подсказку, джиг.Попробовал этот вариант:(Есть ли причина, по которой новым пользователям не разрешается использовать теги изображений?) http://www.freeimagehosting.net/image.php?8eb1892142.jpg и получите сообщение о том, что веб-части нет на странице (как и раньше).Я уже искал это исключение, и я уверен, что это единственный используемый экземпляр WebPartManager.
Спасибо
Holger
Решение
Попробуй это
public class CustomWebPart : System.Web.UI.WebControls.WebParts.WebPart {
private int _instanceId = 0;
[Personalizable()]
public int InstanceId {
get { return _instanceId; }
set { _instanceId = value; }
}
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
if (!Page.IsPostBack) {
if(InstanceId == 0) {
InstanceId = 0; //set it to something
//this.WebPartManager.SaveChanges(this);
using(SPLimitedWebPartManager manager = SPContext.Current.Web.GetLimitedWebPartManager(Page.Url, PersonalizationScope.Shared)) {
foreach(AspNetWebpart webpart in manager.WebParts) {
using(webpart) {
if(webpart == this) {
manager.SaveChanges(this);
manager.SaveChanges(webpart);
}
}
}
}
}
}
}
}
Другие советы
Наконец-то найдено решение:
http://www.sharepointdev.net/sharepoint--development-programming/save-web-part-settings-45128.shtml
Вот фрагмент:
SPContext.Current.Web.AllowUnsafeUpdates = true;
SPFile file = SPContext.Current.File;
SPLimitedWebPartManager mgr = file.GetLimitedWebPartManager(PersonalizationScope.Shared);
for (int index = 0; index < mgr.WebParts.Count;index++ )
{
if (mgr.WebParts[index].ID == this.ID)
{
// Do your changes
mgr.SaveChanges(mgr.WebParts[index]);
}
}
SPContext.Current.Web.AllowUnsafeUpdates = false;
Мы также можем использовать:
base.SetPersonalizationDirty();
Что касается поиска вашей веб-части в SPLimitedWebPartManager
, вместо зацикливания вы можете использовать StorageKey
собственность.
using(SPLimitedWebPartManager manager = SPContext.Current.Web.GetLimitedWebPartManager(SPContext.Current.Web.Url, PersonalizationScope.Shared))
{
MyWebPartType part = (MyWebPartType)manager.WebParts[((SPWebPartManager(WebPartManager.GetCurrencWebPartManager(Page))).GetStorageKey(this)];
...the rest of your code.
Или если вы наследуете свою веб-часть от Microsoft.SharePoint.WebPartPages.WebPart
это просто this.StorageKey
.