禁用动态创建按钮的“原因验证”

时间:2011-09-06 09:08:19

标签: c# asp.net

我创建了两次相同的按钮:一次在Page_Load上,另一次在:Page_PreRender上。 我希望看到相同的行为,但是,在Page_PreRender上创建的按钮不能按照预期的方式工作。 (即属性“causeValidation”仍然为真)。

“我想为page_preRender中的按钮禁用”causeValidation“,我想在PreRender中使用它。此外,我希望Button_Click函数对两个按钮都执行,目前只对”Page_load“上创建的按钮执行

我正在为此行为寻找解决方案或解释

谢谢。

看看代码:

protected void Page_Load(object sender, EventArgs e)
    {            
        form1.Controls.Add(GetButton("Button1", "Click"));
    }

    protected void page_PreRender(object sender, EventArgs e)
    {
        form1.Controls.Add(GetButton("Button3", "Click"));
    }

    private Button GetButton(string id, string name)
    {
        Button b = new Button();
        b.Text = name;
        b.ID = id;
        b.CausesValidation = false;
        b.Click += new EventHandler(Button_Click);
        b.OnClientClick = "ButtonClick('" + b.ClientID + "')";
        return b;
    }

    protected void Button_Click(object sender, EventArgs e)
    {
        ClientScript.RegisterClientScriptBlock(this.GetType(), ((Button)sender).ID, "<script>alert('Button_Click');</script>");
        Response.Write(DateTime.Now.ToString() + ": " + ((Button)sender).ID + " was clicked");
    }

这是javascript:

<script type="text/javascript">
    function ButtonClick(buttonId) {
        alert("Button " + buttonId + " clicked from javascript");
    }
</script>

更新 让我添加一下:两个按钮都执行客户端的脚本。这意味着创建了按钮。 “请参阅函数GetButton()”。

此外,我在“onRender”而不是“on Page_Load”上创建按钮的原因是:如果我有一个表格用于将数据输入表格动态,我添加单击按钮上的数据,页面将首先返回PostBack,然后执行事件处理程序,(即数据被添加到表中但将显示在NEXT postBack上)。因此,PreRender用于在button_click事件更新后显示表格。

我希望这个添加很有用

2 个答案:

答案 0 :(得分:5)

enter image description here

从这张图片中可以看出,它表示asp.net页面生命周期(从MSDN复制而来),Event HandlingPreRender之前。因此,为了触发Button_Click,必须在Event Handling之前创建按钮本身。 Page PreInit是添加动态控件的首选位置。

您可以自己查看,只需在Page_LoadPage_PreRenderButton_Click添加断点即可。注意触发的顺序?

答案 1 :(得分:0)

检查asp.net page lifecycle:事件在页面加载后处理, PreRender之前处理。

ASP.NET无法处理涉及尚不存在的控件的事件。