【问题标题】:Sharepoint's event flow giving me problemsSharepoint 的事件流给我带来了问题
【发布时间】:2012-01-17 21:02:03
【问题描述】:

我一直在玩弄 SharePoint 2010,老实说,除了事件流的处理方式之外,我没有任何问题。我可能遗漏了什么。

到目前为止,我有一个可视 Web 部件,它的控件中有一个按钮和一个用于简单文本输出的标签。因此,我为自己创建了一个测试模型对象(名为 CounterModel 的简单对象类,具有 int 属性),这样我就可以轻松地通过视图状态跟踪它。

因此,在我的 Web 部件的初始化函数中,我检查 ViewState[ID_COUNTER_MODEL] 是否等于 null。如果是我创建一个新的CounterModeland 将它添加到视图状态,如果它不为空,我只需将我的ViewState[ID_COUNTER_MODEL] 添加到我的CounterModel 类型的私有属性中。

在初始化之后,我添加了一个鼠标单击按钮类型的事件侦听器。我面临的问题是,当我按下按钮时,表单被释放、重新创建,然后调用我的事件侦听器,这导致从ViewState[ID_COUNTER_MODEL] 重新分配我的 CounterModelobject。因此,事件侦听器中的任何更改都不会真正注册。我做错了什么,我应该如何处理这些情况。

以下是一些代码示例:

TestCounter 对象

class CounterModel
{
    public int number;

    public CounterModel() {
        number = 0;
    }
}

可视化 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;
    }

【问题讨论】:

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


    【解决方案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 打电话。

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      相关资源
      最近更新 更多