Web 部件的自定义属性何时保存?
-
16-10-2019 - |
题
我有一个包含许多自定义属性的 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
.