2012-01-13 8 views
4

JavaScriptでサーバーコントロールを取得しようとしています。テスト目的のために、JavaScript関数をページロードイベントから呼び出しています。ASP.NET document.getElementById( '<%= Control.ClientID%>'); nullを返す

protected void Page_Load(object sender, EventArgs e){ 
    ClientScript.RegisterClientScriptBlock(GetType(), "js", "confirmCallBack();", true); 
} 

そして、私のJavaScript関数は

function confirmCallBack() { 
    var a = document.getElementById('<%= Page.Master.FindControl("PlaceHolderContent").FindControl("Button1").ClientID %>'); 
    var b = document.getElementById('<%=Button1.ClientID%>'); 
} 

私の問題は、AとBのリターンヌルの両方ということです。ページソースを表示しても、正しいClientIDが返されます。

マスターページを使用していることを追加する必要があります。

アイデア

+0

イムつもりはあなたが望むものを達成しようとするが、速い答え、なぜいけないのためにあなたはページロードのIDを介してIDを渡そうとしますか? confirmCallBack(Button1.ClientID); –

+0

簡単な答えは、自動生成されたASP idsを使用していません – Raynos

答えて

8

Gotcha!

あなたがここに私の例を

RegisterStartupScriptの代わりRegisterClientScriptBlockを使用する必要があります。

マスターページ:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="MasterPage.master.cs" 
    Inherits="prueba.MasterPage" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 

    <script type="text/javascript"> 

     function confirmCallBack() { 
      var a = document.getElementById('<%= Page.Master.FindControl("ContentPlaceHolder1").FindControl("Button1").ClientID %>'); 

      alert(a.value); 

     } 

    </script> 

    <asp:ContentPlaceHolder ID="head" runat="server"> 
    </asp:ContentPlaceHolder> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> 
     </asp:ContentPlaceHolder> 
    </div> 
    </form> 
</body> 
</html> 

のWebForm1.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.Master" AutoEventWireup="true" 
    CodeBehind="WebForm1.aspx.cs" Inherits="prueba.WebForm1" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 

</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> 
<asp:Button ID="Button1" runat="server" Text="Button" /> 
</asp:Content> 

WebForm1.aspx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace prueba 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      ClientScript.RegisterStartupScript(this.GetType(), "js", "confirmCallBack();", true); 

     } 
    } 
} 
+0

ありがとうございました。私は年を重ねていた。 – user346443

+0

ありがとうございました、私の前のユーザーのように、私は何時間もこれに固執していました。私は私の髪をリッピングしていた。0。 – Banzboy

0

Button1は表示されますか?つまり、サーバー側からです。 Button1.Visibleがtrueであることを確認します。

Visible以外のコントロールはHTMLでレンダリングされないため、ClientIDに割り当てられていますが、実際にはクライアント側に存在しません。

+0

目に見えないasp.netコントロールのIDを取得する方法はありますか? –

+0

@DKR ClientIDプロパティは、ページにレンダリングされるIDをコントロールに渡す必要があります。さもなければ、この情報はクライアント側ではほとんど役に立ちません。 – Humberto

関連する問題