Thanks
WebPartManager.ImportWebPart() requires personalization to be modifiable, since we assume that ImportWebPart() is only called when a user is adding a dynamic WebPart to the page.
However, you can work around this by writing a custom WebPartManager and WebPartPersonalization to fake it:
public class MyWebPartManager : WebPartManager {
protected override WebPartPersonalization CreatePersonalization() {
return new MyWebPartPersonalization(this);
}
public override WebPart ImportWebPart(System.Xml.XmlReader reader, out string errorMessage) {
((MyWebPartPersonalization)Personalization).Importing = true;
WebPart webPart = base.ImportWebPart(reader, out errorMessage);
((MyWebPartPersonalization)Personalization).Importing = false;
return webPart;
}
}
public class MyWebPartPersonalization : WebPartPersonalization {
public MyWebPartPersonalization(WebPartManager owner)
: base(owner) {
}
internal bool Importing;
protected override IDictionary UserCapabilities {
get {
IDictionary userCapabilities = base.UserCapabilities;
if (Importing) {
userCapabilities[WebPartPersonalization.ModifyStateUserCapability] =
WebPartPersonalization.ModifyStateUserCapability;
}
return userCapabilities;
}
}
}