Sharepoint Web部件OnPreRender PostBack动态文本框在按钮处理程序中不可访问

时间:2010-05-12 21:17:41

标签: c# .net sharepoint web-parts

我有一个自定义的webpart,它扩展了System.Web.UI.WebControls.WebPart并实现了一个EditorPart。

我已经在重写的CreateChildControls方法中添加了所有静态控件,因为我知道这使得它们在PostBacks中保持不变。

但是,我在重写的OnPreRender方法中添加了一些TextBox,因为我添加的实际TextBox取决于我在OnPreRender中调用的Web Service返回的数据。必须在OnPreRender中调用Web服务,因为我需要在EditorPart中设置一些Property值。如果我将此逻辑构建到CreateChildControls方法中,显然在应用编辑后第一个PostBack上的数据不可用,因为在CreateChildControls之后恢复了PostBack事件。这意味着在刷新数据之前必须将页面发布两次,这只是笨拙的。

如何让这些TextBox及其输入的文本值在PostBacks中保持不变,以便我可以在按钮处理程序中访问它们?

感谢您的帮助, 马特

2 个答案:

答案 0 :(得分:0)

这最终为我工作:

  • 在CreateChildControls中添加一个“隐藏”TextBox(我用width = 0实现了这个; visible = false并且enabled = false不起作用)
  • 在PreRender中,检查在动态TextBox中输入的任何值,以便将params传递给数据调用(在我的情况下是Web Service),这将来自解析“隐藏”TextBox中的值(稍后解释)
  • 数据调用后,添加TextBox,确保重新填充上次回发前输入的任何先前值(通过解析“隐藏”TextBox文本)
  • 最后,向名为“onClick”的按钮添加一个属性,并将值设置为一个javascript函数,该函数获取TextBoxes的值(使用document.getElementById并为每个TextBox传递TextBox.ClientID)并创建一个格式化的字符串将TextBox ID和值存储在“隐藏”TextBox中。

因为在CreateChildControls中添加了“隐藏”TextBox,所以它的值将被恢复并可以在PostBack上访问。

希望这可以帮助那些人,我知道我在这个上花了一些时间。

答案 1 :(得分:0)

FWIW,您可以直接在ViewState中存储值,而无需通过TextBox控件中的代理访问它。在这个片段中,我将访问视图状态包含在普通旧属性中:

public string WebServiceResult
{
  get
  {
    string text = (string) ViewState["WebServiceResult"];
    if (text != null)
       return text;
    else
       return string.Empty;
  }
  set
  {
    ViewState["WebServiceResult"] = value;
  }
}