Sharepoint的活动流程给我带来了麻烦

时间:2012-01-16 18:11:52

标签: c# .net sharepoint sharepoint-2010 sharepoint-2007

我一直在使用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;
    }

1 个答案:

答案 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中执行。