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

C# Sharepoint Web部件OnPreRender回发动态文本框在按钮处理程序中不可访问,c#,.net,sharepoint,web-parts,C#,.net,Sharepoint,Web Parts,我有一个自定义Web部件,它扩展了System.Web.UI.WebControl.webpart并实现了一个EditorPart 我在重写的CreateChildControls方法中添加了所有静态控件,因为我知道这会使它们在回发中持久化 但是,我在重写的OnPreRender方法中添加了一些文本框,因为我添加的实际文本框取决于我在OnPreRender中调用的Web服务返回的数据。必须在OnPreRender中调用Web服务,因为我需要在EditorPart中设置的一些属性值。如果我将此逻辑

我有一个自定义Web部件,它扩展了System.Web.UI.WebControl.webpart并实现了一个EditorPart

我在重写的CreateChildControls方法中添加了所有静态控件,因为我知道这会使它们在回发中持久化

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

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

谢谢你的帮助,
马特

这最终对我有用:

  • 在CreateChildControls中添加一个“隐藏”文本框(我用width=0;visible=false和enabled=false实现了这一点,但不起作用)
  • 在PreRender中,检查在动态文本框中输入的任何值,以便将参数传递给数据调用(在我的例子中是Web服务),这将来自解析“隐藏”文本框中的值(稍后解释)
  • 数据调用后,添加文本框,确保重新填充上次回发之前输入的所有值(通过解析“隐藏”文本框文本)
  • 最后,向名为“onClick”的按钮添加一个属性,并将该值设置为获取文本框值的javascript函数(使用document.getElementById并为每个文本框传递TextBox.ClientID),并创建一个格式化字符串以将文本框ID和值存储在“隐藏”文本框中
由于在CreateChildControls中添加了“隐藏”文本框,因此它的值将被还原,并可在回发时访问


希望这有助于其他人,我知道我在这方面花了一些时间。

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

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