string script = "<script language='javascript'> " +
                " parent.parent.document.getElementById('txtValue').value = '" + TextBox1.Text + "' ;" +
                " parent.parent.GB_hide();</script> ";string script = "<script language='javascript'> " +
                " parent.parent.document.getElementById('<%= txtValue.ClientID %>').value = '" + TextBox1.Text + "' ;" +
                " parent.parent.GB_hide();</script> ";            ClientScript.RegisterStartupScript(
                typeof(Page),
                "",
                script);返回数值的两种写法为什么只有上面那个能执行成功呢,下面的一执行就提示:
parent.parent.document.getElementById(...) 为空或者不是对象

解决方案 »

  1.   

    下面这本书中的解释:《庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术》   
                                                    --- 基于VS 2008(兼容VS 2005)C#http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx下面出自书中原文:
       Asp.net技术可以说是技术的一次伟大变革,但也对开发人员带来一些隐患,因为它使开发人员变得“比较傻”,web服务器技术是一个比较复杂的技术,程序员天生就遇到Asp.net,从而认为开发web程序像cs架构那么简单,不但不了解客户端技术,而是由于Asp.net的易用性(为了实现易用性而把一些web技术封闭到底层)使开发人员对服务器端技术也不甚了解。我对这个是比较愤慨的,这也是我要写这本书的另一个重要原因。我发现好多开发人员对Asp.net技术的理解甚微,与我一起工作的甚至有很多年开发经验的朋友对一些Asp.net基本性的原理还不了解,也可以说终究是因为Asp.net技术的出现以及开发环境的集成性让很多开发人员变成“傻瓜式”的编程,使开发人员没有了机会去了解那些东西。拿Asp.net为例,举几个开发人员常犯的比较基础的认识错误:Ø  分不清楚控件的服务端和客户端ID页面中有个ID为TextBox1的服务端控件,很多开发人员在客户端访问该控件的DOM元素是这么访问的: var txtbox = document.getElementByID(“TextBox1”);  之后有一天,他突然发现代码出问题了,通过以上代码不能够再检索到TextBox1控件的客户端元素了。对服务端控件来说这种写法是错误的,这里的正确写法是: var txtbox = document.getElementById('<%= TextBox1.ClientID %>'); 出错原因是没有理解一个服务端控件不像客户端控件只有一个id,服务端控件有三个属性标示控件的唯一名称,这三个属性是:ID,UniqueID和ClientID。其中ID 表示我们给它命名的ID,不管在服务端还是客户端程序中不会使用这个ID; UniqueID表示控件的服务端ID, 在服务端标志控件的唯一名称; ClientID表示控件的客户端ID,在客户端标记页面中元素唯一名称。从使用角度讲, 如果继承了INamingContainer接口, 当我们为子控件设定一个ID后, 它的UniqueID和ClientID会自动加上父控件名称和分隔符作为前缀;一般来说, 在服务端分隔符默认使用 “$” 进行分隔(UniqueID), 但是到了客户端会自动将这些 “$” 转换为下划线 “_”(ClientID),即客户端ID和服务端ID名称是一样的, 只是分隔符不同。上面代码出错的原因是某天他把TextBox1控件放到了母版页容器控件中。在增加母版页之前,TextBox1控件由于没有父容器,所以它的ID,UniqueID以及ClientID都是”TextBox1”,只是恰同巧合;一旦,TextBox1放到了容器控件中,它的UniqueID和ClientID都会发生改变,要增加父容器的名称作为前缀,比如它的ClientID可能变为:“Panel1_TextBox1”,服务端UniqueID变为:“Panel1$TextBox1”。这里限于篇幅,后面章节还有详解。
      

  2.   

    不好意思, 这个文本编辑器效果不好, 建议复制到word中看.  
      

  3.   

    string script = " <script language='javascript'> " + 
                    " parent.parent.document.getElementById(' <%= txtValue.ClientID %>').value = '" + TextBox1.Text + "' ;" + 
                    " parent.parent.GB_hide(); </script> "; //改成string script = " <script language='javascript'> " + 
                    " parent.parent.document.getElementById('"+txtValue.ClientID+"').value = '" + TextBox1.Text + "' ;" + 
                    " parent.parent.GB_hide(); </script> "; <%= txtValue.ClientID %>是在HTML中用的,而不是在后台CS代码中用的
      

  4.   

    我也知道问题可能是命名的问题,我的控件确实是放在母版页里面的,如果我写入
    parent.parent.document.getElementById('ctl00_ContentPlaceHolder1_txtValue').value 那么数值就能够正确
    返回,但是我写下面的方式就老是出错,我也用是是ClientID 啊,为什么不能成功呢
    parent.parent.document.getElementById(' <%= txtValue.ClientID %>').value 
      

  5.   

    parent.parent.document.getElementById('<%= txtValue.ClientID %>').value 看是在哪里写了如果是HTML中写就不会有错了,但如果在后台CS中肯定会找不到对象的,报错也是理所当然的了
      

  6.   

    5楼的写法不行,因为我是 页面A,调用页面B,然后页面B传值为页面A,在页面B上根本没有控件 txtValue 还有我这个环境是使用了 greyBox
      

  7.   

    晕..早说嘛那只有用查找的方法了,因为你用了母版页,它的ID会有一些前缀string script = " <script language='javascript'> " + 
                    " var textboxs=parent.parent.document.getElementsByTagName('input'); "+
                    " for(var i=0;i<textboxs.length;i++) "+
                    " { "+
                    "  if(textboxs[i].id.indexOf('txtValue')>0 && textboxs[i].type=='text') "+
                    "  {textboxs[i].value='" + TextBox1.Text + "';parent.parent.GB_hide(); break;} "+
                    " } "+</script> "; 
      

  8.   

    肯定是命名的问题了,运行一下,调试一个用微软的script bug