我一直在寻找试图弄清楚这一点,但要么我没有使用正确的术语,要么我只是没有找到答案。如果在我为没有找到它而道歉之前已经提出并回答了这个问题 - 如果答案已经存在,我将不胜感激。
我有一个带有自定义属性(webpart 类和用户控件)的可视化 webpart——所有这些都用 WebBrowsable(true)、WebPartStorage(Storage.Shared) 等属性进行了适当的装饰。为了完整起见,我还尝试了 Personalizable(Personalization.Shared)。我想做的是,我不想在标准的“编辑 Web 部件”界面中编辑这些 Web 部件属性,而是想根据当前用户是否是站点管理员来显示它们的编辑控件。
这就是我的问题所在:当我从用户控件设置自定义属性时,设置没有被保存。我在 webpart 类的 setter 方法中设置了一个断点,并验证了确实传递了一个值,但是当 webpart 在页面上重新加载时,设置恢复为空字符串的默认值。
我觉得我错过了一些基本步骤来保存这些设置。下面是一些片段来演示我正在使用的代码。显然,这不是整个代码,而只是说明我所处位置的相关部分。
SafetyTrackerControl.ascx.cs:
public partial class SafetyTrackerControl : System.Web.UI.UserControl
{
public string EmployeeComments { get; set; }
public SafetyTrackerWebpart ParentWebPart { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
txtEmployeeComments.Text = EmployeeComments;
}
protected void btnSave_Click(object sender, EventArgs e)
{
ParentWebPart.EmployeeComments = txtEmployeeComments.Text;
}
}
SafetyTrackerWebPart.cs
[XmlRoot(Namespace = "SafetyTrackerSettings")]
public class SafetyTrackerWebPart : WebPart
{
SafetyTrackerControl _SafetyTrackerControl;
protected override void CreateChildControls()
{
base.CreateChildControls();
_SafetyTrackerControl = (SafetyTrackerControl)Page.LoadControl("~/_ControlTemplates/SafetyTracker/SafetyTrackerControl.ascx");
_SafetyTrackerControl.EmployeeComments = EmployeeComments;
_SafetyTrackerControl.ParentWebPart = this;
}
internal string _employeeComments;
[WebBrowsable(true),
WebDisplayName("Additional Comments"),
WebPartStorage(Storage.Shared)]
public string EmployeeComments
{
get { return _employeeComments; }
set { _employeeComments = value; }
}
}