没有加载回发的表格值?

时间:2011-04-07 17:24:46

标签: c# asp.net

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

2 个答案:

答案 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())。