没有加载返回的表单值

本文关键字:表单 返回 加载 | 更新日期: 2023-09-27 17:49:01

我使用Firebug进行验证,并且我的回调成功触发。在"Post"部分,它显示我的TextBox(更确切地说,是为我的文本框呈现的HTML)成功提交了它的表单值(无论在文本框中输入了什么)。然而,在服务器端,该值没有被恢复到新创建的TextBox中——即使我重新创建的所有内容都具有与最初相同的ID。此外,我检查了Page.Request.Form集合(参见:getcontrolashhtml())和我尝试的所有事情都没有返回我的值。这是代码,感谢任何帮助。

我的目标是执行回调(当前工作),并恢复我的文本框的值从张贴回来的表单值(不工作)。为简洁起见,省略了一些(可工作的)代码。

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();
    }
}

没有加载返回的表单值

string s = Page.Request.Form[textboxForLabel.UniqueID];

所以Controls.Add()不是无害的添加到一个简单的集合。它马上就有影响了控件正在添加,因为它"长大"了。以更快的速度。但是这些步骤通过它控制速度很快转发的内容不完全一致到所有可用的事件页面。唯一有资格参加的活动这些进程依次为:LoadViewState, Load, preender .

根据我在InfinitiesLoop中发现的文章片段,TextBox没有获得更新数据的原因实际上是因为当控件被添加到控件树中时,该控件会赶上控件生命周期中的其他控件。但是LoadPostData方法不适合这个追赶过程。换句话说,数据在请求中可用。Form集合,但是LoadPostData()方法永远不会被调用,因为'MyForm'控件是从RaiseCallbackEvent方法添加的——它在生命周期中比LoadPostData事件晚。所以调用RegisterRequiresPostBack可能会工作(如果它强制LoadPostData被调用),但不是Priyank在评论中指出的原因。

我还应该补充一点,有必要从导致Ajax回调发生的Javascript代码中执行以下操作:
__theFormPostData = ""; WebForm_InitCallback();

这背后的原因是,它清除表单不是最新的,然后更新它(通过调用InitCallback())在实际执行回调请求之前。