none
Page_Load事件中怎么调用aspx中的js方法 RRS feed

  • 问题

  • 现在有一个页面A,通过A弹出模态窗体B,并向B中通过

    window.showModalDialog("ExportExcelFromGridView.aspx?second=" + Date.parse(new Date()), arrayMeetingInfo, "dialogWidth=850px;dialogHeight=480px;status=yes;scroll=yes;resizable=yes");

    的方法传递了一个参数arrayMeetingInfo。我想在B页面的Page_Load方法中获取这个参数,我是用在aspx中加js脚本

    $(function(){

    var idSet = window.dialogArguments;
    $("#hiddenMeetingInfo").val(idSet[0]);  //hiddenMeetingInfo是一个隐藏域

    })

    的方法获取这个参数,但是打断点this.hiddenMeetingInfo.Value的值每次都为空,怎么才能获取这个参数呢?

    2012年10月15日 1:59

答案

全部回复

  • 尝试在服务端获取这个内容(Page_Load事件中):

    Request.QueryString("second");

    如果需要在客户端获取,请先把以上获得的内容存入到一个HiddenField中,然后jQuery通过获取HiddenField的值获取请求得到的内容。

    $(function(){
     $("#<%=hiddenMeetingInfo.ClientID%>%").val(); //获取HiddenField的内容 
    })

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年10月15日 4:15
  • 首先,你alert(idSet )看是否传递过来

    其次,你的对象id="hiddenMeetingInfo"是正确的吗?服务器控件要通过hiddenMeetingInfo.ClientID得到

    $("#<%=hiddenMeetingInfo.ClientID%>").val(idSet[0]);


    【孟子E章】


    2012年10月15日 4:47
    版主
  • Request.QueryString("second");的方法获取的值的长度有限制,所以不想用这种方法。

    您说的第二种方法,貌似不行,打断点发现,页面首先执行Page_Load方法,然后才加载js脚本并执行,所以在Page_Load的得到隐藏域的值为“”,但是既然页面没有加载js脚本,为什么还可以得到value为""的隐藏域呢?不是该报“未将对象引用到实例”这个异常了吗?好奇快呀...

    2012年10月15日 5:07
  • 首先把Request.QueryString("second");内容存入到一个HiddenField中(在 Page_Load事件中)。

    然后jQuery应该可以获取了。


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年10月15日 5:10
  • idSet的值可以传过来,这个可以确认,您可以看一下我对楼上的回答,也算对问题的补充吧,谢谢了哈。

    <input type="hidden" id="hiddenMeetingInfo" name="hiddenMeetingInfo" runat="server"/> 这是隐藏域的代码,这个应该也可以吧?

    我想这是不是页面生命周期的问题,在执行Page_Load的时候,aspx中所有的js方法还没有加载,所以

    $(function(){

    var idSet = window.dialogArguments;
    $("#hiddenMeetingInfo").val(idSet[0]);  //hiddenMeetingInfo是一个隐藏域

    })

    这段代码没有起作用,反正我打断点的时候是这样的,在Page_Load方法里面和上面写的js脚本里面同时打断点,页面首先执行Page_Load方法,然后才会执行js脚本。有没有什么方法可以先执行js脚本再执行Page_Load方法呢?

    2012年10月15日 5:16
  • 服务器端的代码当然是先执行的,执行完毕才发送到客户端的。

    先执行js脚本,那就使用ajax提交吧,

    页面执行顺序搞清清楚。


    【孟子E章】

    2012年10月15日 5:27
    版主
  • 这样接收的字符串的长度有限制吧?如果超过了限制的大小页面好像会报“请求字符串的长度超过配置的maxQueryStringLength的值”这个错误,所以我才用了创建模态窗体时,通过第二个参数传值的方式,然后在模态窗体中,通过

    $(function(){

    var idSet = window.dialogArguments;
    $("#hiddenMeetingInfo").val(idSet[0]);  //hiddenMeetingInfo是一个隐藏域

    })

    的方式接收值。

    2012年10月15日 5:44
  • 能不能在页面周期的某个时期,也就是js脚本加载完的某个时期,放入调用js的方法,将值赋给一个隐藏域呢?也就是当页面执行到这个时期的时候,js和控件已经全部加载完毕,然后我就可以调用js方法给隐藏域赋值了...页面生命周期有这个时期吗?
    2012年10月15日 6:26
  • 尝试用我方法+web.config中加入
    <httpRuntime maxRequestPathLength="360" maxQueryStringLength="1024" /> 


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 占占wyz 2012年10月16日 5:34
    2012年10月15日 6:34
  • 页面加载周期与js无关

    你怎么还没理解

    服务器端的代码是先执行的,执行完毕才发送到客户端,才能执行客户端的js。

    要先得到客户端的内容,你只能通过url或者post到后台接收


    【孟子E章】



    2012年10月15日 7:37
    版主
  • Request.QueryString("second"); + <httpRuntime maxRequestPathLength="360" maxQueryStringLength="1024" /> 方法确实可以解决问题,但是这样的话配置文件中maxQueryStringLength这个属性需要设置非常大,否则一旦参数传的字符串长度非常大的话就要报错了。我还在想能不能在cs文件中的Page_Load方法中像js中

    $(function(){

    var idSet = window.dialogArguments;
    $("#hiddenMeetingInfo").val(idSet[0]);  //hiddenMeetingInfo是一个隐藏域

    })

    来接收传入到模态窗体的参数呢?


    2012年10月15日 7:52
  • 这方面没太接触过,不是太明白,问白痴问题请见谅哈。

    页面周期中的Render方法是不是加载html和js这些东西的啊?我想重写一下页面生命周期中Render以后执行的方法,就是说在html和js加载过以后再调用js方法,这样的话就可以在后台执行js方法了,因为调用的时候页面上已经存在这个js方法了,如果在Page_Load中调用js方法,此时的页面上还不存在这个方法。

    说的不一定对,见谅哈


    2012年10月15日 8:07
  • 尝试Page_Load中:

    public partial class WebForm1 : System.Web.UI.Page
        {
    
            const string KEY = "TEST";
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    if (!ClientScript.IsStartupScriptRegistered(KEY))
                    {
                        ClientScript.RegisterStartupScript(GetType(), KEY, "alert('OK')", true);
                    }
                }
            }
        }

    把"alert('OK')"替换成你自己的东西。考虑到RegisterStartupScript会在</form>前注册东西,可见应该是整个Html加载完毕之后(猜想,可以试试)。


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年10月15日 8:16
  • $(function(){

    var idSet = window.dialogArguments;
    $("#hiddenMeetingInfo").val(idSet[0]);  //hiddenMeetingInfo是一个隐藏域

    })

    就是最好的方法。任何在后台的代码执行的,都是先执行的后台的代码,后台的所有事件执行完毕了,才有html字符串内容,发送到客户端,客户端浏览器才解析html和js,然后执行js代码

    js代码是 客户端的东西。是不会在服务器端执行的。


    【孟子E章】


    2012年10月15日 9:36
    版主
  • 
    

    将你的JS调用写到,隐藏域标签的后面如何?

    <html>
    <head><title></title></head>
    <script type="javascript/text">
    function GetParam()
    { 
    var idSet = window.dialogArguments;
    $("#<%=hiddenMeetingInfo.ClientID%>").val(idSet[0]); 
    }
    </script>
    <body>
    <asp:HiddenField ID="hiddenMeetingInfo" runat="server"/>
    <script type="javascript/text">
        GetParam();
    </script>
    </body>
    </html>

    可能是因为获取参数的时候,隐藏域还没有加载的原因。

    
    2012年10月15日 10:41
  • 您说的这个方法还是不行,在js的方法和Page_Load中同时打上断点,程序首先要将Page_Load中的代码执行完,然后才会进入到断点中,等于说还是不能在Page_Load中接收父页面传给模态窗口的值,
    var idSet = window.dialogArguments;
    只能在js中获取,js又是在Page_Load以后执行。
    2012年10月16日 1:17
  • 在Page_Load没有执行完之前,是不会去调用js方法的,所以想在Page_Load中获取父页面传给模态窗体的数据看来是不行的
    2012年10月16日 1:26
      • 您说的这个方法还是不行,在js的方法和Page_Load中同时打上断点,程序首先要将Page_Load中的代码执行完,然后才会进入到断点中,等于说还是不能在Page_Load中接收父页面传给模态窗口的值,
        var idSet = window.dialogArguments;
        只能在js中获取,js又是在Page_Load以后执行。

    我的方法不行么?RegisterStartUpScripth会将js放到</form>前,这将意味着js是在所有Html控件输出完毕之后才执行。

     

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年10月16日 1:56
  • 是啊,还是不行,因为就算按您说的通过RegisterStartUpScripth来调用js方法,程序也是要把Page_Load方法执行完以后才会调用js方法。

    所以在Page_Load方法里面还是无法获取父页面传过来

    var idSet = window.dialogArguments 的数据看来模态窗体如果想在Page_Load中获取父窗体传过来的数据,还是只能靠get方法传递数据了...
    2012年10月16日 3:16