1

我需要在我的 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 文字对象

4

2 回答 2

3

您不能以这种方式添加Server - Html/Web控件。您必须在事件中创建一个ControlPage_Init/Page_Load对象并将其添加到PlaceHolder'sControls 集合中。

在标记 (.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请求服务器资源而不是处理服务器事件。这个问题的替代解决方案使用控件——尤其是 GridView/ListView,我相信这些控件和绑定机制将解决这个问题。Server

另一种可能性是使用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);
    }
于 2012-08-30T04:30:18.533 回答
1

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

但是,如果您决定继续沿着这条路走下去,则需要通过调用__doPostBack()具有正确__EVENTTARGET__EVENTARGUMENT属性集的客户端脚本函数来回发。

这篇 SO 帖子显示了一个快速而肮脏的黑客解决方法在这里,通过asp:button在屏幕上放置一个 hidden ,然后更改您的代码以调用隐藏按钮 click

于 2012-08-30T04:42:21.607 回答