正确实现带回发的webpart?

时间:2009-02-17 09:46:06

标签: sharepoint sharepoint-2007 postback web-parts

我要做的是创建一个webpart,它有一个文本框,你可以在webpart上设置文字(h2)的值,然后发送一个“保存”按钮,然后相应地设置文字。这适用于一个巨大的警告;当页面在回发后加载时,文字未被更改。但是,如果我记录文字中实际设置的内容,则它具有新值。此外,如果我再次重新加载页面(F5),它会正确显示。

起初我认为它必须是ViewState,所以我为所有控件禁用了它。我确认它没有保存在ViewState中(解码后)。所以ViewState没有保存旧值。

我正在使用“CreateChildControls”将我的控件添加到webpart。回发由一个简单的事件处理程序处理。

有什么想法吗?

为了记录,我正在使用MOSS 2007。

4 个答案:

答案 0 :(得分:3)

听起来像是一个ASP.NET事件计时问题。尝试在页面加载事件中调用EnsureChildControls()。这可确保在处理回发事件之前调用CreateChildControls()方法并将控件添加到页面中。如果您的控件首先在PreRender或Render阶段添加,那么他们接收回发数据将为时已晚。在下一页加载之前,您将看不到更改。

答案 1 :(得分:1)

也许这篇博文可能会帮助您更好地了解webpart的生命周期并解决您的问题。 http://platinumdogs.wordpress.com/2008/10/14/sharepoint-webpart-lifecycle-events/

答案 2 :(得分:0)

您可以随时使用AJAX更新面板,将文字控件放在其中,并在更新面板上调用UDP.Update。另外,通过初始示例检查,您的文字控件上有runat="server"。您应该能够对Page_Load事件添加更改,这应该出现在webpart上。

答案 3 :(得分:0)

这是一个建议。无论如何它对我有用。

using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

namespace Skaar.UI
{
    public class PostBackWebPart:WebPart
    {
        private Literal literal;
        private TextBox textBox;
        protected override void OnInit(System.EventArgs e)
        {
            base.OnInit(e);
            literal=new Literal();
            literal.Mode = LiteralMode.PassThrough;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
            Controls.Add(literal);
            textBox=new TextBox();
            textBox.AutoPostBack = true;
            Controls.Add(textBox);
            textBox.TextChanged += textBox_TextChanged;                                                                                                                                                                                                                                                                                                                                      
        }

        void textBox_TextChanged(object sender, System.EventArgs e)
        {
            literal.Text = string.Format("<h1>{0}</h1>", textBox.Text);
        }
    }
}