2012-01-04 66 views
3

我一直在寻找这里和谷歌几天,试图找出为什么我不能在javascript中获得hiddenfield变量的值。访问时,该值返回为未定义。
我有一个ASP HiddenField内的UpdatePanel是一个.aspx网页(标准问题)中的自定义用户控件的一部分。在javascript中访问ASP HiddenField

在我的用户控件中,我需要使用C#将HiddenField(hdnServer)的.Value设置为javascript。但由于某种原因,以下方面没有得到正确的价值。

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看起来像什么? – 2012-01-04 02:30:26

+0

为什么添加MessageBox.Show?去掉它。 – adatapost 2012-01-04 02:31:16

+0

它与隐藏的领域无关,当然。 – gdoron 2012-01-04 02:37:05

回答

6

您需要设置的ClientIDMode,如果你想让它简单:

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

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

或者,如果您使用ClientID属性请勿设置ClientIDMode:

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

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

我在HiddenField中发现一个错误,指出其中没有名为ClientIDMode的属性。 <%hdnServer.ClientID%>是我尝试它的原始方式。返回undefined。 – Jordan 2012-01-04 03:03:34

+0

在控件上设置ClientIDMode,查看我发布的代码。 – scottm 2012-01-04 03:22:28

0

你可以这样做:

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

相反的:

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

而且改变这种:

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

要这样:

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

当我这样做时,我仍然得到那个temp和serverName = undefined。 – Jordan 2012-01-04 02:41:34

+0

涉及哪些主页? – justinlabenne 2012-01-04 02:54:08

+0

是的。是否有一部分我应该发布? – Jordan 2012-01-04 02:56:16

1

试试这个:

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

这将返回一个空值。 “” – Jordan 2012-01-04 02:54:29

+0

我再次查看了您的代码,并看到您使用计时器加载控件后5秒钟设置了隐藏控件的值。那时,页面已经被渲染并发送到浏览器。作为测试,尝试在加载时立即将隐藏控件初始化为一个值。 – 2012-01-04 12:15:03

+0

我在Page_Load上设置了hdnServer的值,它工作。当我使用var temp = document.getElementById(“<%= hdnServer.ClientID%>”)时,该值被正确接收。为什么是这样?谢谢您的帮助。 – Jordan 2012-01-04 15:28:58

3

用户控件一直是一个奇怪的问题,使用js进行引用,然后使用母版页进行引用。

对于隐藏域做到这一点:

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

在JS,这样做:

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

我收到一个异常,指出HiddenField没有ClientIDMode属性.. – Jordan 2012-01-04 03:17:37

+0

啊......这是asp 4.0的新功能,猜测这不是你正在使用的。您需要加载页面,并使用view-source查看隐藏域的ID。你将最终得到一个“master-page_userControl_hdnServer”id,你需要把它放入js中:var serverName = document.getElementById('ContentPlaceHolder1_ucWebUserControl_hdnServer')。 – justinlabenne 2012-01-04 03:23:57

+0

好的。我得到了视图源代码,并尝试使用它,并得到一个未定义的错误。我也尝试将解决方案切换到4.0,并将clientIDMode设置为静态,并返回一个空字符串“”。这是一个已知的问题吗? – Jordan 2012-01-04 03:53:31

2

你需要使用'" 像:

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

是小心不要使用"。您只使用'