2012-01-04 60 views
3

ここで数日間Googleを検索して、JavaScriptのhiddenfield変数の値を取得できない理由を理解しようとしています。アクセスされると、値は未定義として返されます。
私は、.aspx Webページ(標準の問題)のカスタムユーザーコントロールの一部であるUpdatePanel内にASP HiddenFieldを持っています。JavaScriptのASP HiddenFieldにアクセスする

私のユーザコントロールでは、C#で設定した後、JavaScriptでHiddenField(hdnServer)の.Valueを取得する必要があります。しかし、なんらかの理由で、以下のことが正しい値を得ていない。

C#コードのMessageBoxは正しい値を返します(ここでのコードはテスト値を持っています)が、javascriptでアクセスすると未定義です。

userControl.ascx:コードビハインド

//this function is called when the timer created in document.ready() elapses 
//returns the correct hdnServer value in the check. 
    var checkHdn = function() { 
     var temp = document.getElementById("<%=hdnServer.ClientID%>").value; 
     temp = temp.toString(); 
     if (temp != "") { 
      $('#LoadingViewer').hide(); 
      clearInterval(checkSrv); 

      //enable start button 
      $('#startBtn').attr("Enabled", "true"); 
     } 
    }; 

    function RdpConnect() { 

       //serverName = undefined here. should be ip address when set in c# 
       var serverName = document.getElementById("<%= hdnServer.ClientID %>").value; 
       alert(serverName); 
       if (serverName != "") { 
        MsRdpClient.Server = serverName; 
       } 
      }; 

userControl.ascx.cs:ここ

public partial class userControl : System.Web.UI.UserControl 
    { 
     System.Timers.Timer timer; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      timer = new System.Timers.Timer(5000); 
      timer.Start(); 
     } 

     protected void testOnTick(object sender, System.Timers.ElapsedEventArgs e) 
     { 
       hdnServer.Value = "test value"; 
       startBtn.Enabled = true; 
       timer.Enabled = false; 
     } 
    } 

は、念のためのHiddenFieldためのASPがある:userControl.ascx:

<asp:ScriptManager ID="ScriptManager1" runat="server" /> 
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always"> 
    <Triggers> 
     <!--trigger not used --> 
     <!-- <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />--> 
    </Triggers> 
    <ContentTemplate> 
     <asp:HiddenField ID="hdnServer" runat="server" /> 
     <asp:Label ID="Label1" Text="Loading, please wait." CssClass="loading" runat="server" 
      Font-Size="XX-Large" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

事前にアドバイスをありがとうございます!

編集:ここでメッセージボックスが削除.. がレンダリングされたHTML:http://pastie.org/3122247

+1

レンダリングされたHTMLの外観はどうですか? –

+0

MessageBox.Showを追加する理由それを除く。 – adatapost

+0

隠しフィールドとは関係ありません。 – gdoron

答えて

6

<asp:HiddenField runat="server" ClientIDMode="Static" Id="hidServer"/> 

<script type="text/javascript"> 
    alert($("#hidServer").val()); 
</script> 

または、場合ClientIDプロパティを使用し

var serverName = $('#hdnServer').val(); 
+0

HiddenFieldにClientIDModeというプロパティが存在しないというエラーが表示されます。 <%hdnServer.ClientID%>は私が試した元の方法でした。 undefinedを返します。 – Jordan

+0

ClientIDModeがコントロールに設定されています。投稿したコードを見てください。 – scottm

0

あなたはこれを行うことができます。

var temp = $('#hdnServer').val(); 

の代わりに:

var temp = document.getElementById("<%=hdnServer.ClientID%>").value; 

また、これを変更します

var serverName = document.getElementById("<%= hdnServer.ClientID %>").value; 
これに

:あなたはそれを簡単にしたい場合は、ClientIDModeに設定する必要があり

var temp = $('#mytestcontrol_hdnServer').val(); 
+0

これを実行すると、まだtempとserverName = undefinedが得られます。 – Jordan

+0

マスターページにはどのようなものが関係していますか? – justinlabenne

+0

はい。私は投稿する必要がありますその一部ですか? – Jordan

1

はこれを試してみてくださいクライアントIDモードを設定しないでください:

<asp:HiddenField runat="server" Id="hidServer"/> 

<script type="text/javascript"> 
    alert($("<%= hidServer.ClientID %>").val()); 
</script> 
+0

これは空の値を返します。 "" – Jordan

+0

あなたのコードをもう一度見て、タイマーを使用してコントロールがロードされた後、5秒後に隠しコントロールの値を設定することを確認しました。その時点で、ページは既にレンダリングされ、ブラウザに送信されています。テストとして、非表示のコントロールをすぐに値が読み込まれるように初期化してみてください。 –

+0

Page_LoadにhdnServerの値を設定していました。値は、var temp = document.getElementById( "<%= hdnServer.ClientID%>")を使用したときに正しく受信されました。どうしてこれなの?助けてくれてありがとう。 – Jordan

3

ユーザーコントロールは、jsを使用して参照し、次にマスターページを参照する際に、常に不思議な問題でした。jsの中

<asp:HiddenField ID="hdnServer" runat="server" ClientIDMode="Static" /> 

、次の操作を行います:隠しフィールドで

はこれを行うこと

var serverName = document.getElementById('<%= hdnServer.ClientID %>').value; 

var serverName = document.getElementById('hdnServer').value; 
+0

HiddenFieldにClientIDModeプロパティがないことを示す例外が発生しています。 – Jordan

+0

ああ...これはasp 4.0の新機能で、使用しているものではないと推測しています。ページをロードし、view-sourceを使ってhiddenフィールドに与えられているidを確認する必要があります。 「master-page_userControl_hdnServer」というIDになります。このIDは、次のようにjsに格納する必要があります。var serverName = document.getElementById( 'ContentPlaceHolder1_ucWebUserControl_hdnServer')。 – justinlabenne

+0

私はビューのソースIDを取得し、それを使用しようとし、未定義のエラーが発生しました。また、ソリューションを4.0に切り替えて、clientIDModeをstaticに設定して空の文字列 ""を返しました。これは既知の問題ですか? – Jordan

2

を、あなたは次のように'ない" を使用する必要があります慎重に使用しないでください"。あなただけを使用している'

関連する問題