2013-01-24 86 views
3

這裏是我的示例代碼:如何在使用javascript的<form>標籤內追加<asp:Button />等。

<script type="text/javascript"> 
    $(function() { 
     $('body') 
      .append('<form id="form1"></form>'); //append a new form element with id mySearch to <body> 
     $('#form1') 
      .attr("runat", "server") 
      .append('<asp:Button runat="server" ID="btn1"/>'); 
    }); 
    </script> 

這是我的身體標記看起來像:

<body> 

    </body> 

我得到這個錯誤:

Control 'btn1' of type 'Button' must be placed inside a form tag with runat=server. 

提前感謝! :)

更新:我想省略

.append('<asp:Button runat="server" ID="btn1"/>'); 

當我運行螢火蟲我得到這個:

<body> 
     <form id="form1" runat="server"></form> 
    </body> 

它有中用runat = 「服務器」。爲什麼我不能把我的asp:Button放在裏面? O_O

+0

只需使用一個常規的輸入按鈕......這正是'asp:button'呈現的樣子。 – MikeSmithDev

+0

是的,它的工作原理,但我想使用像asp:Repeater'asp ctrls綁定我的數據。有沒有其他方法?無論如何,謝謝@MikeSmithDev –

+2

你不能通過Javascript添加服務器控件。你爲什麼甚至想要這樣做?爲什麼你不能直接在頁面中輸入這些控件並擺脫你的Javascript? – MikeSmithDev

回答

4

您更新的問題仍然是錯誤的方法。你可以這樣做:

$('#form1').attr("runat", "server") 

,並期望它的工作一樣,如果你輸入的那樣:因爲上面的標籤被處理服務器端

<form runat="server"> 

,實際上呈現在客戶端是這樣的:

<form method="post" action="default.aspx" id="ctl00"> 

這看起來不像你在做什麼。

你有兩個選擇:

  1. 停止嘗試添加任何ASP.NET控件(即具有<asp:開始)或任何與它runat="server"使用Javascript。如果你真的必須用Javascript來做到這一點,那麼使用普通的HTML控件。

  2. 停止使用Javascript並實際上正確使用<asp:控件或HTML控件與runat="server",然後從代碼背後做你需要做的事情。

現在爲切線。

關於您的錯誤Control 'btn1' of type 'Button' must be placed inside a form tag with runat=server.假設您正確使用<form runat="server">並重試。你可能會發現它(有點)的作品!

<form id="form1" runat="server"> 
    <asp:Button ID="btn2" Text="Button 2" runat="server" /> 
    <script> 
     $(document).ready(function() { 
      $('#<%= form1.ClientID %>').append('<asp:Button Text="Button 1" ID="btn1" runat="server"/>'); 
     }); 
    </script> 
</form> 

渲染,但它是不正確的。除了令人困惑的討厭的代碼外,它只能工作,因爲ASP.NET實際上爲那個<asp:Button渲染了HTML,並將它放在腳本塊中,所以發送到客戶端的是這個(和兩個按鈕..但仍然不是你輸入的內容)。

<input type="submit" name="btn2" value="Button 2" id="btn2" /> 
<script> 
    $(document).ready(function() { 
     $('#form1').append('<input type="submit" name="btn1" value="Button 1" id="btn1" />'); 
    }); 
</script> 

而現在的部分你沒有想到。從代碼隱藏,你可以這樣做頁面加載:

protected void Page_Load(object sender, EventArgs e) 
{ 
    btn1.Text = "This is Awful"; 
} 

和不是有兩個按鈕,屏幕上說Button 2Button 1,第二個按鈕現在說This is Awful

...但是,如果您嘗試這樣做(並且我不確定爲什麼ASP.NET會根據JavaScript塊轉換代碼),那麼這是完全錯誤的,並且會爲大多數其他<asp:控件打破。因此,請參閱上述兩個選項,瞭解如何繼續。

+0

原因我試圖把一個ASP CTRL和追加它使用JavaScript是因爲我想做一個像slideDown當用戶點擊一個ASP按鈕:按鈕asp:Repeater會做slideDown。我想我應該接受你的建議。感謝@MikeSmithDev! :) –

+0

@DavidDeChavez你想要做什麼仍然是可能的,只是採取不同的方法...任何新方法的問題,只是問一個新的問題:)另外,我在我的答案中增加了一點點解釋。 – MikeSmithDev

1

的所有代碼這一部分首先按預期

.append('<asp:Button runat="server" ID="btn1"/>'); 

runat="server"攜手合作,當你設計的頁面必須補充的是控制,或在服務器端語法PRO,由編譯器不會運行代碼隱藏在服務器上並創建一個html部分。

當你在客戶端添加javascript時,服務器並不知道任何東西,也不能運行它,所以編譯它。

現在,在第一部分中,您嘗試添加一個新的form內頁上的客戶端再次

$('body') 
      .append('<form id="form1"></form>'); 
     $('#form1') 

這是Web窗體上的一個問題,因爲一個asp.net必須只包含一個表單元素。在asp.net中所有已準備好呈現的表單中,您需要添加其他按鈕,而不是創建第二個按鈕。

要繼續前進,您需要在頁面上定義一個表單標記(而不是javascript)。如果你想添加回傳輸入按鈕,你可以做,但必須將它們放在現有的表單中,不要創建新的表單,並且使用runat = server。然後手動處理該代碼後面的代碼 - 這意味着您不打算調用任何特定的函數,您只需閱讀回發後的變量。

+0

是的,這是真的。但是當我在頁面上定義表單標籤時,我仍然不能放置任何asp ctrls。請參閱上面我更新的問題。謝謝@Aristos –

+0

所以它似乎沒有辦法使用javascript放置任何asp ctrls。不管怎麼說,還是要謝謝你! :D –

相關問題