我一直在使用SharePoint 2010,说实话我没有任何问题,除了可能如何处理事件流。我可能会遗漏一些东西。
截至目前,我有一个可视化的Web部件,其控件中有一个按钮,以及一个简单文本输出的标签。所以我自己做了一个测试模型对象(名为CounterModel
的简单对象类,带有int
属性),因此我可以轻松地跟踪视图状态。
所以在我的web部分的init函数中,我检查ViewState[ID_COUNTER_MODEL]
是否等于null。如果是,我创建一个新的CounterModeland
将其添加到视图状态,如果它不为空,我只需将我的ViewState[ID_COUNTER_MODEL]
添加到CounterModel
类型的私有属性。
在init之后,我添加一个鼠标类型的事件监听器,点击按钮。我面临的问题是,当我按下按钮时,表单被处理,重新创建,然后调用我的事件监听器,导致我从ViewState[ID_COUNTER_MODEL]
重新分配我的CounterModelobject。因此,事件监听器中的任何更改都不会真正注册。我做错了什么,我应该如何应对这些情况。
以下是一些代码示例:
TestCounter对象
class CounterModel
{
public int number;
public CounterModel() {
number = 0;
}
}
Visual Web部件
private CounterModel counterModel;
public CounterWebPart() {
if (ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL] != null){
counterModel = (CounterModel)ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL];
} else {
counterModel = new CounterModel();
ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL] = counterModel;
}
}
protected override void CreateChildControls(){
CounterWebPartUserControl control = (CounterWebPartUserControl)Page.LoadControl(_ascxPath);
Controls.Add(control);
control.GetBtnChangeLabel().Click += OnBtnChangeLabelClicked;
control.GetLabel().Text = counterModel.number.ToString();
}
public void OnBtnChangeLabelClicked(object sender, EventArgs e) {
counterModel.number++;
(CounterModel)ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL] = counterModel;
}
答案 0 :(得分:1)
这不是SharePoint事件模型的问题,而是ASP.Net WebForms事件模型的问题。请查看http://msdn.microsoft.com/en-us/library/ms178472.aspx以获取更多信息,但ViewState永远不会填充在您的控件的构造函数中,因此您始终构建一个新的counterModel
- 这就是您没有看到数字增量的原因。尝试在OnLoad
中运行该代码。
此外,您不应该依赖于相对于事件处理程序调用CreateChildControls(在某些情况下,它会在进程中的不同点调用)。它应该用于创建控件将它们添加到树中,以及连接事件。 IE浏览器。不要再调用control.GetLabel().Text = counterModel.number.ToString();
,请在OnPreRender
中执行。