动态创建的HTML按钮serverclick功能不起作用

时间:2012-08-30 04:25:01

标签: asp.net html postback literals

我需要在我的ASP.NET C#代码隐藏中动态创建HTML按钮,我必须在我的文字控件中插入此按钮,我使用以下语法:

literal.Text+=<button id=\"MyButton\" runat=\"server\" OnServerClick=\"MyButton_Click\">Click Me</Button>";
显示

按钮,它会导致回发,但我的服务器点击功能(MyButton_Click)没有被调用,这里出了什么问题?我当然应该使用文字,我可以在文字中使用ASP.NET控件吗?

我想在此按钮导致回发后调用函数,我可以在文字中使用其他对象吗?我当然应该使用文字

感谢您的回答,我的文字中有很多代码,如下所示:

......
......

dynTable += "</td></tr>";
                        dynTable += "<tr><td></td></tr>";
                        dynTable += "<tr><td></td></tr>";
                        dynTable += "<tr><td></td></tr>";
                        dynTable += "<tr><td></td></tr>";

                        dynTable += "<tr><td align=\"left\">";
                        dynTable += "<button id=\"MyButton\" type=\"submit\" runat=\"server\" OnServerClick=\"MyButton_Click\">Foo</button>";
                        dynTable += "</tr></td> </table>  ";
                    }
                }

                //=====================================
                dynTable += "                   </td>";
                dynTable += "               </tr>";
                dynTable += "             </table>";
                dynTable += "           </td>";
                dynTable += "         </tr>";
                dynTable += "       </table>";

                dynTable += "     </td>";
                dynTable += "  </tr>";

            }
            dynTable += "</table>";

        }
        ReviewPlace.Text = dynTable;

ReviewPlace是我的asp.net文字对象

2 个答案:

答案 0 :(得分:3)

您不能以这种方式添加服务器 - Html / Web 控件。您必须在Page_Init/Page_Load事件中创建 Control 的对象,并将其添加到PlaceHolder's控件集合中。

在标记(.aspx)中添加PlaceHolder1控件

<form id="form1" runat="server">
   <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</form>

并编写Page_Init处理程序,

 protected void Page_Init(object sender, EventArgs e)
    {
        System.Web.UI.HtmlControls.HtmlButton button = new System.Web.UI.HtmlControls.HtmlButton();
        button.InnerText = "OK";
        //Event handler - Lambda (anonymous method) expression
        button.ServerClick += (sa, ea) =>
            {
                Response.Write("button is pressed");
            };
        //Named Event handler
        button.ServerClick += new EventHandler(button_ServerClick);
        PlaceHolder1.Controls.Add(button);
    }

 void button_ServerClick(object sender, EventArgs e)
   {
    Response.Write("Another handler");
   }

编辑:我建议您使用jQuery/JavaScript - ajax来请求服务器资源,而不是处理服务器事件,如果您希望/想要生成标记。该问题的替代解决方案 使用Server constrols - 尤其是GridView / ListView,我确信这些控件和绑定机制将解决该问题。

另一种可能性是使用Table服务器控件。看看样本:

//For ease of use I'v subclass the `TableRow`
 public class Row : TableRow
    {
        public Row(int col)
        {
            for(int i=0;i<col;i++)
            Cells.Add(new TableCell());
        }
        public TableCell this[int index]
        {
            get { return Cells[index]; }
        }
    }

和Page_Init代码填充Table对象。

protected void Page_Init(object sender, EventArgs e)
    {
        Table table = new Table();

        Row row1 = new Row(3);
        row1[0].ColumnSpan = 3;
        row1[0].Text = "Search";
        table.Rows.Add(row1);

        Row row2 = new Row(3);
        row2[0].Text = "Enter keyword";
        row2[1].Controls.Add(new TextBox());
        table.Rows.Add(row2);

        Row row3 = new Row(3);
        row3[0].ColumnSpan = 3;
        Button button = new Button();
        button.Text = "Search";
        button.Click += (sa, ea) => Response.Write("Button is pressed");
        row3[0].Controls.Add(button);

        table.Rows.Add(row3);

        PlaceHolder1.Controls.Add(table);
    }

答案 1 :(得分:1)

正如AVD指出的那样,这不是一个好主意。

但是,如果您决定继续沿着此路径行进,则需要通过调用客户端脚本函数__doPostBack()函数来回发,并设置正确的__EVENTTARGET__EVENTARGUMENT属性。

此SO帖子显示了一个快速而肮脏的 hack 解决方法,通过在屏幕上放置一个隐藏的asp:button,然后更改您的代码来调用{{3} }。