后台aspx.CS 中取得前台由 javascript脚本赋值的 TextBox值的问题

时间:2021-07-19 17:27:08
我由 Father.aspx 模态弹出子窗 Child.aspx ,然后,把由 父窗传过来的值,赋与 子窗中的一个 TextBox

,但是在子窗的 aspx.CS 中却取不到空上 TextBox 的值。
请看

Child.aspx



<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PopKeywords.aspx.cs" Inherits="WebUI.BusinessCenter.PopKeywords" %>

<!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>
    <link href="../css/css.css" rel="stylesheet" type="text/css" />
    <base target="_self" />
</head>
<body>
    <form id="form1" runat="server">
    <table border="0" cellpadding="0" cellspacing="0" align="center">
        <tr>
            <td height="40" align="center">
              <asp:TextBox ID="txbChild" runat="server" Width="400px"></asp:TextBox> 
            </td>
        </tr>
    </table>
</form>
</body>
</html>
<script type="text/javascript" language="javascript"> 
<!--
    var k = window.dialogArguments;
    //获得父窗口传递来的值 
    if (k != null) {
        document.getElementById("txbChild").value = k.document.getElementById("txbFather").value;
    }
    //--> 
</script> 





然后我在 Child.aspx.CS 后台中取 txbChild 的值


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

namespace WebUI.BusinessCenter
{
    public partial class PopKeywords : System.Web.UI.Page
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string getFatherValue = this.txbChild_getFather.Text.ToString().Trim();
                //实际上,getFatherValue  取得值是空的
            }

        }
}



我分析原因 是这样的:

因为后台是当一加载页面是,程序是由上往下执行,当 后台读到页面中 txbChild 时, javascript 还未给这个 TextBox 赋值,
因为 javascript 是在程序的最后执行的,就是说,程序结束的时,
才执行的这段 js


<script type="text/javascript" language="javascript"> 
<!--
    var k = window.dialogArguments;
    //获得父窗口传递来的值 
    if (k != null) {
        document.getElementById("txbChild").value = k.document.getElementById("txbFather").value;
    }
    //--> 
</script> 



但是这段 js 还只能放在程序最下面,如果放上面,又会导致其它问题,

目前这种情况,怎么才能在 aspx.cs 后台取到前台的这个  txbChild 的值呢 !?

请各位大侠帮忙 !不胜感激!



29 个解决方案

#1


取不到的

#2


我想知道,k.document.getElementById("txbFather").value;这个值,在子窗口中传过来了吗?

#3


我确认一下,
k.document.getElementById("txbFather").value;这个值,在子窗口中传过来了吗?

肯定是传过来了,因为我已经用

document.getElementById("txbChild").value = k.document.getElementById("txbFather").value;

把取过来的值显示出来了,是有值的,

但是就是在 .CS 中取不到。

#4


我有个想法,就是能不能在 

if (!IsPostBack)
            {
                string getFatherValue = this.txbChild_getFather.Text.ToString().Trim();
                //实际上,getFatherValue  取得值是空的
            }


过后,或是过0.1秒再取一次,这样就应该能取到了,这方法可行吗

#5


后台程序要执行完了net把html结果返回给客户端浏览器后,浏览器上才能执行javascript,你的猜想是错误的,不是还没执行到,而是后台已经执行完了,在后台执行的时候输入框是空的,还没有js给它赋值

#6


你可以在前台执行完脚本后,用ajax调后台

#7


哪位大侠能针对我这个现状,或是换种思路能解决一下呢

#8


这个问题解决不了吗

#9


把你要传递的值放入url,而不是argument
然后
string getFatherValue = this.Request[key].toString();

#10


<script type="text/javascript" language="javascript"> 
<!--
    var k = window.dialogArguments;
    //获得父窗口传递来的值 
    if (k != null) {
        document.getElementById("txbChild").value = k;    }
    //--> 
</script> 

#11


在aspx 页面中,比如 js中如何取 TextBox 值


 <script type="text/javascript" language="javascript"> 
<!--
     function openChild() {

         var k = window.showModalDialog("PopKeywords.aspx?ks=<%=System.Web.HttpContext.Current.Server.UrlEncode(TextBox1.Text) %>", window, "dialogWidth:800px;status:no;dialogHeight:700px");
         //var k = window.showModalDialog("PopKeywords.aspx?" + (new Date()).valueOf(), window, "dialogWidth:500px;status:no;dialogHeight:650px")
         if (k != null)
             document.getElementById("txbFather").value = k;
     } 
//--> 
</script>

我这样写取不到值,是空的啊

#12



var keyparams = document.getElementById("<%=txbFather.ClientID%>");
         var k = window.showModalDialog("PopKeywords.aspx?ks=<%=System.Web.HttpContext.Current.Server.UrlEncode(keyparams.value) %>", window, "dialogWidth:800px;status:no;dialogHeight:700px");


我这样写了,但还是不行

#13


最好的方法是加个隐藏域。赋给这个隐藏域就OK。我经常这样写

#14


啊,加载就这要读出来啊。那应该行不通了,url传参吧。

#15


引用 12 楼 tiger8000 的回复:

9楼告诉你了,你视而不见

#16


9楼的+1

#17


9楼的回复:

---------------------------------------

把你要传递的值放入url,而不是argument
然后
string getFatherValue = this.Request[key].toString();
--------------------------------------------

我已经这样做了,但是也碰到问题


<script type="text/javascript" language="javascript"> 
<!--
     function openChild() {

         var k = window.showModalDialog("PopKeywords.aspx?ks=<%=System.Web.HttpContext.Current.Server.UrlEncode(TextBox1.Text) %>", window, "dialogWidth:800px;status:no;dialogHeight:700px");
         //var k = window.showModalDialog("PopKeywords.aspx?" + (new Date()).valueOf(), window, "dialogWidth:500px;status:no;dialogHeight:650px")
         if (k != null)
             document.getElementById("txbFather").value = k;
     } 
//--> 
</script>

我这样写取不到值,是空的啊


#18


js写到txbFather控件下面

#19


我把 js 写到了 那个 textbox 下面了,但还是 url 传递过来的是空值

#20





   <tr>
        <td height="30" bgcolor="#CAD2F4" align="left">&nbsp;&nbsp;关键字选择</td>
        <td colspan="5" bgcolor="#FFFFFF" align="left">&nbsp;&nbsp;
           <asp:TextBox  ID="txbFather" class="inputtext" runat="server" Width="430px"  onclick="openChild()"></asp:TextBox>
          </td>
      </tr>


<script type="text/javascript" language="javascript"> 
<!--
           function openChild() {
               var k = window.showModalDialog("PopKeywords.aspx?ks=<%=System.Web.HttpContext.Current.Server.UrlEncode(txbFather.Text) %>", window, "dialogWidth:800px;status:no;dialogHeight:700px");
               //var k = window.showModalDialog("PopKeywords.aspx?" + (new Date()).valueOf(), window, "dialogWidth:500px;status:no;dialogHeight:650px")
               if (k != null)
                   document.getElementById("txbFather").value = k;
           } 
//--> 
</script>


我这样写了,但还是不行

#21


引用 9 楼 microtry 的回复:
把你要传递的值放入url,而不是argument
然后
string getFatherValue = this.Request[key].toString();

嘿嘿,起初我就想到了,楼主试试撒

#22


看我17 楼的,我已经做 url 了,但还有问题

#23


引用 3 楼 tiger8000 的回复:
我确认一下,
k.document.getElementById("txbFather").value;这个值,在子窗口中传过来了吗?

肯定是传过来了,因为我已经用

document.getElementById("txbChild").value = k.document.getElementById("txbFather").value;

把取过来的值显示出来了,是有值的,……
+1

#24


方法有很多种,你要是在服务器端的到,可以这样
Father.aspx

<%@ 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">

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
  <script type="text/javascript">
    function openChild(txt) {
      k = window.showModalDialog("Child1.aspx?txt=" + encodeURIComponent(txt.value));
    }
  </script>
</head>
<body>
  <form id="form1" runat="server">
  <table>
    <tr>
      <td height="30" bgcolor="#CAD2F4" align="left">
        &nbsp;&nbsp;关键字选择
      </td>
      <td colspan="5" bgcolor="#FFFFFF" align="left">
        &nbsp;&nbsp;
        <asp:TextBox ID="txbFather" class="inputtext" runat="server" Width="430px" onclick="openChild(this)"></asp:TextBox>
      </td>
    </tr>
  </table>
  </form>
</body>
</html>


Child1.aspx
<%@ Page Language="C#" %>

<!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>
</head>
<frameset rows="0,*" border="0" frameborder="0">
<frame src=""></frame>
<frame src="Child.aspx?txt=<%=Server.UrlEncode(Request.QueryString["txt"]) %>"></frame>
</frameset>
</html>


Child.aspx
<%@ 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">


  protected void Page_Load(object sender, EventArgs e)
  {
    if (!Page.IsPostBack)
    {
      txbChild.Text = Request.QueryString["txt"];
    }
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:TextBox ID="txbChild" runat="server"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>
</html>



使用frameset而不是使用base target=_self可以解决浏览器兼容性问题。

另外,如果使用js传递,可以传clientID

另外,你要明白代码的执行顺序,js代码是后执行的,服务器端代码是先执行的,js代码还没执行,你怎么等在服务器端得到呢?

#25


引用楼主 tiger8000 的回复:
我分析原因 是这样的:

因为后台是当一加载页面是,程序是由上往下执行,当 后台读到页面中 txbChild 时, javascript 还未给这个 TextBox 赋值,
因为 javascript 是在程序的最后执行的,就是说,程序结束的时,
才执行的这段 js....................


搞清楚楼上说的asp.net页面生命周期基本概念。

服务器是接受浏览器端请求,然后经过几乎整个生命周期,最终通过Render方法输出了html,这个html被浏览器接收到,才在窗口里显示出网页,以后才有所谓的javascript代码执行。

#26


不管你的js放在设计页面的上面还是下面,就算是“放出花来”,它也不可能在服务器端执行。等它在浏览器端执行时,服务器端当前页面实例对象别说什么代码都不执行,就是自身也早已经被GC销毁了。

#27


引用 24 楼 net_lover 的回复:
方法有很多种,你要是在服务器端的到,可以这样
Father.aspx


HTML code

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.d……
这会是楼主想要的

#28


如果你自己没有找对思路,那么退而求其次重新从设计角度改变自己的思路做起才是“正着”。如果一门心思只等要别人给你一个代码,就容易钻到死胡同里边出不来了。

#29


谢过各位技术前辈!!

更感谢net_lover (【孟子E章】) 真正的为我解决实际问题!不多说,就是一个字:打心里感动加感激!呵

 

#1


取不到的

#2


我想知道,k.document.getElementById("txbFather").value;这个值,在子窗口中传过来了吗?

#3


我确认一下,
k.document.getElementById("txbFather").value;这个值,在子窗口中传过来了吗?

肯定是传过来了,因为我已经用

document.getElementById("txbChild").value = k.document.getElementById("txbFather").value;

把取过来的值显示出来了,是有值的,

但是就是在 .CS 中取不到。

#4


我有个想法,就是能不能在 

if (!IsPostBack)
            {
                string getFatherValue = this.txbChild_getFather.Text.ToString().Trim();
                //实际上,getFatherValue  取得值是空的
            }


过后,或是过0.1秒再取一次,这样就应该能取到了,这方法可行吗

#5


后台程序要执行完了net把html结果返回给客户端浏览器后,浏览器上才能执行javascript,你的猜想是错误的,不是还没执行到,而是后台已经执行完了,在后台执行的时候输入框是空的,还没有js给它赋值

#6


你可以在前台执行完脚本后,用ajax调后台

#7


哪位大侠能针对我这个现状,或是换种思路能解决一下呢

#8


这个问题解决不了吗

#9


把你要传递的值放入url,而不是argument
然后
string getFatherValue = this.Request[key].toString();

#10


<script type="text/javascript" language="javascript"> 
<!--
    var k = window.dialogArguments;
    //获得父窗口传递来的值 
    if (k != null) {
        document.getElementById("txbChild").value = k;    }
    //--> 
</script> 

#11


在aspx 页面中,比如 js中如何取 TextBox 值


 <script type="text/javascript" language="javascript"> 
<!--
     function openChild() {

         var k = window.showModalDialog("PopKeywords.aspx?ks=<%=System.Web.HttpContext.Current.Server.UrlEncode(TextBox1.Text) %>", window, "dialogWidth:800px;status:no;dialogHeight:700px");
         //var k = window.showModalDialog("PopKeywords.aspx?" + (new Date()).valueOf(), window, "dialogWidth:500px;status:no;dialogHeight:650px")
         if (k != null)
             document.getElementById("txbFather").value = k;
     } 
//--> 
</script>

我这样写取不到值,是空的啊

#12



var keyparams = document.getElementById("<%=txbFather.ClientID%>");
         var k = window.showModalDialog("PopKeywords.aspx?ks=<%=System.Web.HttpContext.Current.Server.UrlEncode(keyparams.value) %>", window, "dialogWidth:800px;status:no;dialogHeight:700px");


我这样写了,但还是不行

#13


最好的方法是加个隐藏域。赋给这个隐藏域就OK。我经常这样写

#14


啊,加载就这要读出来啊。那应该行不通了,url传参吧。

#15


引用 12 楼 tiger8000 的回复:

9楼告诉你了,你视而不见

#16


9楼的+1

#17


9楼的回复:

---------------------------------------

把你要传递的值放入url,而不是argument
然后
string getFatherValue = this.Request[key].toString();
--------------------------------------------

我已经这样做了,但是也碰到问题


<script type="text/javascript" language="javascript"> 
<!--
     function openChild() {

         var k = window.showModalDialog("PopKeywords.aspx?ks=<%=System.Web.HttpContext.Current.Server.UrlEncode(TextBox1.Text) %>", window, "dialogWidth:800px;status:no;dialogHeight:700px");
         //var k = window.showModalDialog("PopKeywords.aspx?" + (new Date()).valueOf(), window, "dialogWidth:500px;status:no;dialogHeight:650px")
         if (k != null)
             document.getElementById("txbFather").value = k;
     } 
//--> 
</script>

我这样写取不到值,是空的啊


#18


js写到txbFather控件下面

#19


我把 js 写到了 那个 textbox 下面了,但还是 url 传递过来的是空值

#20





   <tr>
        <td height="30" bgcolor="#CAD2F4" align="left">&nbsp;&nbsp;关键字选择</td>
        <td colspan="5" bgcolor="#FFFFFF" align="left">&nbsp;&nbsp;
           <asp:TextBox  ID="txbFather" class="inputtext" runat="server" Width="430px"  onclick="openChild()"></asp:TextBox>
          </td>
      </tr>


<script type="text/javascript" language="javascript"> 
<!--
           function openChild() {
               var k = window.showModalDialog("PopKeywords.aspx?ks=<%=System.Web.HttpContext.Current.Server.UrlEncode(txbFather.Text) %>", window, "dialogWidth:800px;status:no;dialogHeight:700px");
               //var k = window.showModalDialog("PopKeywords.aspx?" + (new Date()).valueOf(), window, "dialogWidth:500px;status:no;dialogHeight:650px")
               if (k != null)
                   document.getElementById("txbFather").value = k;
           } 
//--> 
</script>


我这样写了,但还是不行

#21


引用 9 楼 microtry 的回复:
把你要传递的值放入url,而不是argument
然后
string getFatherValue = this.Request[key].toString();

嘿嘿,起初我就想到了,楼主试试撒

#22


看我17 楼的,我已经做 url 了,但还有问题

#23


引用 3 楼 tiger8000 的回复:
我确认一下,
k.document.getElementById("txbFather").value;这个值,在子窗口中传过来了吗?

肯定是传过来了,因为我已经用

document.getElementById("txbChild").value = k.document.getElementById("txbFather").value;

把取过来的值显示出来了,是有值的,……
+1

#24


方法有很多种,你要是在服务器端的到,可以这样
Father.aspx

<%@ 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">

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
  <script type="text/javascript">
    function openChild(txt) {
      k = window.showModalDialog("Child1.aspx?txt=" + encodeURIComponent(txt.value));
    }
  </script>
</head>
<body>
  <form id="form1" runat="server">
  <table>
    <tr>
      <td height="30" bgcolor="#CAD2F4" align="left">
        &nbsp;&nbsp;关键字选择
      </td>
      <td colspan="5" bgcolor="#FFFFFF" align="left">
        &nbsp;&nbsp;
        <asp:TextBox ID="txbFather" class="inputtext" runat="server" Width="430px" onclick="openChild(this)"></asp:TextBox>
      </td>
    </tr>
  </table>
  </form>
</body>
</html>


Child1.aspx
<%@ Page Language="C#" %>

<!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>
</head>
<frameset rows="0,*" border="0" frameborder="0">
<frame src=""></frame>
<frame src="Child.aspx?txt=<%=Server.UrlEncode(Request.QueryString["txt"]) %>"></frame>
</frameset>
</html>


Child.aspx
<%@ 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">


  protected void Page_Load(object sender, EventArgs e)
  {
    if (!Page.IsPostBack)
    {
      txbChild.Text = Request.QueryString["txt"];
    }
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:TextBox ID="txbChild" runat="server"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>
</html>



使用frameset而不是使用base target=_self可以解决浏览器兼容性问题。

另外,如果使用js传递,可以传clientID

另外,你要明白代码的执行顺序,js代码是后执行的,服务器端代码是先执行的,js代码还没执行,你怎么等在服务器端得到呢?

#25


引用楼主 tiger8000 的回复:
我分析原因 是这样的:

因为后台是当一加载页面是,程序是由上往下执行,当 后台读到页面中 txbChild 时, javascript 还未给这个 TextBox 赋值,
因为 javascript 是在程序的最后执行的,就是说,程序结束的时,
才执行的这段 js....................


搞清楚楼上说的asp.net页面生命周期基本概念。

服务器是接受浏览器端请求,然后经过几乎整个生命周期,最终通过Render方法输出了html,这个html被浏览器接收到,才在窗口里显示出网页,以后才有所谓的javascript代码执行。

#26


不管你的js放在设计页面的上面还是下面,就算是“放出花来”,它也不可能在服务器端执行。等它在浏览器端执行时,服务器端当前页面实例对象别说什么代码都不执行,就是自身也早已经被GC销毁了。

#27


引用 24 楼 net_lover 的回复:
方法有很多种,你要是在服务器端的到,可以这样
Father.aspx


HTML code

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.d……
这会是楼主想要的

#28


如果你自己没有找对思路,那么退而求其次重新从设计角度改变自己的思路做起才是“正着”。如果一门心思只等要别人给你一个代码,就容易钻到死胡同里边出不来了。

#29


谢过各位技术前辈!!

更感谢net_lover (【孟子E章】) 真正的为我解决实际问题!不多说,就是一个字:打心里感动加感激!呵