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

サーバーを追加することはできません-そのようにHTML/Webコントロール。イベントでControlのオブジェクトを作成し、それをControlsコレクションに追加する必要があります。Page_Init/Page_LoadPlaceHolder'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してサーバーリソースを要求することをお勧めします。この問題の代替ソリューション、コントロール(特にGridView / ListView )を使用することです。これらのコントロールとバインディングメカニズムにより、この問題が解決されると確信しています。Server

もう1つの可能性は、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、画面に非表示を配置し、コードを変更して非表示のボタンをクリックすることです。

于 2012-08-30T04:42:21.607 に答える