我有一个包含许多自定义属性的 Web 部件。用户不得仅设置这些客户属性之一。该属性是一个 int,表示唯一标识符。

我想在第一次创建 Web 部件时设置此唯一标识符。当然,这意味着如果标识符为 0,我将其设置为一个新值,每次使用值时该值都会递增。

但是,属性中的值根本没有保存。它在 Web 部件位于页面上时可用,刷新时,该值将设置为下一个唯一值。(实际上唯一标识符就是一个自动递增的数字)

该属性看起来像这样:个性化()] public int instanceid {get {return _instanceid;}设置{_instanceId = value;}}}

当由编辑器部分 applychanges 方法设置该属性时,该属性本身可以正常工作。我使用 GetLimitedWebPartManager 尝试了一些示例,但它引发了一个异常,即 Web 部件不在页面上。这些示例中的大多数用于更改任意 Web 部件,这里的重点是,我想在加载 Web 部件时更改其属性。

所以我的问题是,Web 部件的属性何时保存以及如何保存?是否可以从 Web 部件内部保存 Web 部件的客户属性?

有人知道我做错了什么吗?

更新]感谢提示Djeeg。尝试过这个变体:(新用户不可以使用图片标签有什么原因吗?)http://www.freeimagehosting.net/image.php?8eb1892142.jpg并收到 Web 部件不在页面上的消息(像以前一样)。我已经搜索了该异常,并且我确信这是唯一使用的 WebPartManager 实例。

谢谢

霍尔格

有帮助吗?

解决方案

尝试这个

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();

至于在中找到您的 Web 部件 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.

或者,如果您的 Web 部件继承自 Microsoft.SharePoint.WebPartPages.WebPart 这只是 this.StorageKey.

许可以下: CC-BY-SA归因
scroll top