我使用Firebug进行验证,并且我的回调成功触发。在“Post”部分中,它显示我的TextBox(而不是为我的文本框呈现的HTML)成功提交其表单值(无论在文本框中输入了什么)。但是,在服务器端,该值不会恢复到新创建的TextBox中 - 即使我重新创建的所有内容都具有与最初相同的ID。此外,我检查了Page.Request.Form集合(请参阅:getControlAsHtml()),我尝试的任何东西都没有返回我的值。这是代码,感谢任何帮助。
摘要
我的目标是执行回调(当前正在工作)并从发布的返回表单值(不工作)恢复我的TextBox的值。为简洁起见,省略了一些(工作)代码。
public class CreateForm : WebPart, ICallbackEventHandler
{
public string callbackData = "";
public DropDownList list = new DropDownList();
public Panel p = new Panel();
public virtual string GetCallbackResult()
{
return callbackData;
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
//The DropDownList is created here in my real code, but was omitted
//because it is working as expected.
//At the moment, all the DDL does is cause a callback to occur.
p.ID = "theForm";
if (!Page.IsPostBack)
{
MyForm MyForm = new MyForm();
MyForm.ID = "currentForm";
p.Controls.Add(MyForm);
}
Controls.Add(p);
}
/*
* The eventArgument field is parsed to get the desired command.
* Valid commands:
* 1) send - Indicates the user has clicked the 'send' button.
* 2) display - Indicates the user wants to change the form
* currently displayed.
* A drop down box is used to let the user choose the form.
*/
public virtual void RaiseCallbackEvent(string eventArgument)
{
if (eventArgument.StartsWith("display"))
{
//always index 0 for testing.
callbackData = CreateFormByType(0);
}
}
public string CreateFormByType(int index)
{
MyForm test = null;
switch (index)
{
case 0:
test = new MyForm();
break;
}
if (test != null)
{
test.ID = "currentForm";
p.Controls.Add(test);
}
return test != null ? test.getControlAsHtml() : null;
}
}
public class MyForm : Control
{
public Label label = new Label();
public TextBox textboxForLabel = new TextBox();
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
textboxForLabel.ID = "textboxForLabel";
label.AssociatedControlID = "textboxForLabel";
label.Text = "textboxForLabel: ";
this.Controls.Add(label);
this.Controls.Add(textboxForLabel);
}
public virtual string getControlAsHtml()
{
//How come all 3 of these don't return the expected value?
string s = Page.Request.Form[textboxForLabel.ID];
string t = Page.Request.Form[textboxForLabel.ClientID];
textboxForLabel.Text = (string)Page.Request.Form["textboxForLabel"];
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter textWriter = new HtmlTextWriter(sw))
{
this.RenderControl(textWriter);
}
}
return sb.ToString();
}
}
答案 0 :(得分:2)
string s = Page.Request.Form[textboxForLabel.UniqueID];
答案 1 :(得分:1)
所以Controls.Add()不是无辜的 除了简单的收藏。它 立刻产生了影响 控制被添加,因为它“长大” 加快步伐。但是步骤 控制很快 转发不完全对应 所有可用的活动 页。唯一符合条件的活动 这个过程是(按顺序):Init, LoadViewState,Load,PreRender。
根据我在InfinitiesLoop找到的文章片段,TextBox没有获得更新数据的原因实际上是因为当控件添加到控件树时,控件赶上到控制生命周期中的其他控件。但LoadPostData方法不适用于此追赶过程。换句话说,Request.Form集合中的数据 可用,但从不调用LoadPostData()方法,因为'MyForm'控件是从RaiseCallbackEvent方法添加的 - 后者在生命周期中比LoadPostData事件更晚。所以调用RegisterRequiresPostBack可能会起作用(如果它强制调用LoadPostData),但不是因为Priyank在评论中指出的原因。
我还应该补充说,有必要从导致Ajax回调的Javascript代码中执行以下操作:
__theFormPostData = ""; WebForm_InitCallback();
其背后的原因是它清除了不是最新的表单,然后在实际执行回调请求之前更新它(通过调用InitCallback())。