Когда сохраняются пользовательские свойства веб-части?

sharepoint.stackexchange https://sharepoint.stackexchange.com/questions/8519

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top