2014-01-23 60 views
2

我在aspx頁面中使用aspx用戶控件的多個實例時遇到問題。當我試圖通過Java腳本獲取用戶控制元素值時,會發生這種情況。在aspx頁面中使用aspx用戶控件的多個實例

用戶控件代碼:點擊Go按鈕

<script type="text/javascript"> 
    function ucFun() 
    { 
     var a = document.getElementById("<%=tbName.ClientID%>"); 
     alert(a.value); 
     return false; 
    } 
</script> 
<asp:Label Text="Name" runat="server" ID="lblname"></asp:Label> 
<asp:TextBox ID="tbName" runat="server" ></asp:TextBox> 
<asp:Button ID="btSubmit" runat="server" Text="Go" OnClientClick="ucFun()" /> 

Web窗體代碼

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
     <title></title> 
    </head> 
    <body> 
     <form id="form1" runat="server"> 
      <div> 
      <uc:cont runat="server" ID="ucID" /> 
       <uc:cont runat="server" ID="Cont1" /> 
       <uc:cont runat="server" ID="Cont2" /> 
      </div> 
     </form> 
    </body> 
</html> 

,它顯示空詮釋他的警告框,因爲該元素是不確定的。 但是,當我在窗體中有一個用戶控件實例時,它正確顯示了文本框的值。

是否有我們應該寫什麼辦法..

+1

當你的函數名不改變,當你添加了第二控制的第一個版本'ucFun'是覆蓋。 –

+0

感謝Rubens回覆。如果我需要驗證UC字段,那麼我必須在UC讀取字段值中寫入JS。然後使用多個UC實例將會失敗。我們如何實現它 –

回答

4

經過一番搜索找到了不同的解決方案。

http://www.aspsnippets.com/Articles/Issue-JavaScript-in-WebUserControl-not-working-when-used-multiple-times-on-same-page.aspx

在這裏,他們追加一個UNIQUEID與JavaScript的名字,因此不存在與JavaScript的沒有衝突。

UserControl.CS

protected string uniqueKey; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    this.uniqueKey = Guid.NewGuid().ToString("N"); 
    this.Button1.Attributes["onclick"] = "return DisplayMessage_" + uniqueKey + "();"; 
} 

UserControl.aspx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UC_TestCS.ascx.cs" Inherits="UC_TestCS" %> 
<script type ="text/javascript"> 
function DisplayMessage_<%=uniqueKey %>() { 
    var message = document.getElementById("<%=TextBox1.ClientID %>").value; 
    alert(message); 
    return false; 
} 
</script> 
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
<asp:Button ID="Button1" runat="server" Text="Show Message" /> 
+0

這工作,但當內容頁面有回傳這是行不通的,因爲uniqueKey被改變 –

0

參考類似的問題在後

Javascript functions inside ASP.NET User Control

您需要使用ClientScriptManager如在下面的例子中

<%@ Page Language="C#"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<script runat="server"> 
    public void Page_Load(Object sender, EventArgs e) 
    { 
    // Define the name and type of the client scripts on the page. 
    String csname1 = "PopupScript"; 
    String csname2 = "ButtonClickScript"; 
    Type cstype = this.GetType(); 

    // Get a ClientScriptManager reference from the Page class. 
    ClientScriptManager cs = Page.ClientScript; 

    // Check to see if the startup script is already registered. 
    if (!cs.IsStartupScriptRegistered(cstype, csname1)) 
    { 
     String cstext1 = "alert('Hello World');"; 
     cs.RegisterStartupScript(cstype, csname1, cstext1, true); 
    } 

    // Check to see if the client script is already registered. 
    if (!cs.IsClientScriptBlockRegistered(cstype, csname2)) 
    { 
     StringBuilder cstext2 = new StringBuilder(); 
     cstext2.Append("<script type=\"text/javascript\"> function DoClick() {"); 
     cstext2.Append("Form1.Message.value='Text from client script.'} </"); 
     cstext2.Append("script>"); 
     cs.RegisterClientScriptBlock(cstype, csname2, cstext2.ToString(), false); 
    } 
    } 
</script> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
    <head> 
    <title>ClientScriptManager Example</title> 
    </head> 
    <body> 
    <form id="Form1" 
     runat="server"> 
     <input type="text" id="Message" /> <input type="button" value="ClickMe" onclick="DoClick()" /> 
    </form> 
    </body> 
</html> 
+0

據我所知,我們可以通過從服務器端註冊腳本來限制腳本註冊。但是,我們無法獲取實例的相應字段值,因爲我們只爲一個實例註冊了一個腳本。我的意思是顯示<%= tbName.ClientID%>返回用戶控件實例的相應字段的值。 –

+0

這不能解決問題中指定的問題,它是一個完全獨立的主題。 – jtate

相關問題