asp.net 不刷新页面如何实时得到全局变量更新后的值

时间:2022-07-07 06:00:34
如题,
我在项目中定义了一个全局变量,这个全局变量不管你用的是什么,能达到目的就行:我尝试过的有Cookie、把值写入配置文件(web.config)、Session、Application通通均告失败,原因是如果不刷新页面实时得到的值总是更改之前的值,算是没则了。

我在Default.aspx前台页面用setInterval(myfn, 2000)函数每间隔2秒钟获取一次这个全局变量的值,再定义了一个超链接<a href="javascript:window.location.href='go.aspx'"></a>
在go.aspx访问了一个自定义的类Mycls.cs
在Mycls.cs自定义类中有一个for循环(for(int i=0;i<6;i++){}),每循环一次就改变这个全局变量值一次,每循环一次大概要5秒钟,问题是setInterval(myfn, 2000)每次得到的总是全局变量的初始值,更改后的值没有办法得到。但是我调试发现全局变量的值是确实改变了的,不刷新页面就是得不到。。。。

15 个解决方案

#1


说不定是页面缓存 页面路径后面加个随机参数 go.aspx?r=' + Math.random() 大概这样的试一下

#2


你是get请求,有浏览器缓存吧?
设置Cache.SetNoStore()
不知道单词打对了没有,反正就是通知浏览器不要缓存

#3


引用 2 楼 starfd 的回复:
你是get请求,有浏览器缓存吧?
设置Cache.SetNoStore()
不知道单词打对了没有,反正就是通知浏览器不要缓存


还是不行,我把测试的代码放出来看看:
Default.aspx前台代码:
<div>
        <p onclick="go()">点击我到gotopage页面</p>
</div>
    <script type="text/javascript">
        function go() {
            window.location.href = "gotopage.aspx";
        }
        var mytime;
        var i = 0;
        function myfn() {
            i++;            
            var mytext = '<%=(string)Application["myuser"] %>';
            alert(mytext);        //说明,这个地方得到的值始终是初始的值
            if (i >= 20) clearInterval(mytime); 
        }
        mytime = setInterval(myfn, 1000);
    </script>

Default.aspx后台代码:
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Cache.SetNoStore();
        Application["myuser"] = "初始值....";
    }

gotopage.aspx前台代码没有,后台代码:
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Cache.SetNoStore();
        Mycls newcls = new Mycls();
    }

Mycls.cs代码:
public class Mycls
{
public Mycls()
{
//
//TODO: 在此处添加构造函数逻辑
//

        for (int i = 0; i <= 20; i++)
        {
            System.Threading.Thread.Sleep(2000);  //间隔2秒钟
            myprocess();
        }  
}


    private void myprocess() {        
        HttpContext.Current.Application.Set("myuser", "新的值...");    
    }
}

以上就是所有的代码了,帮忙看下,谢谢!

#4


            var mytext = '<%=(string)Application["myuser"] %>';
            alert(mytext);        //说明,这个地方得到的值始终是初始的值


晕死!你贴出 aspx 页面输出到浏览器端的 html 源码!调试要以实际的原理为准,不是以虚幻的概念(什么js调用asp.net纯粹是假话)为依据。

#5


有时候有人会说什么“js调用asp.net”,或者什么“前端调用后端代码”,这就要看看他是否懂得基本的web机制。

#6


看到你的标题 我马上有一个解决方案就是ajax

大概就是(手写有误)


var n=3;
setInterval(function(){
 $.get("xxxx.aspx?ajax=1",function(data){
      alert(data);
  })
},1000*N);



void page_load(o,e)
{
 if !page.ispostback
  if reuetst["ajax"]=="1"
    var xxx=你取值的地方.
    resp.write(xxx);
    resp.end();
}



除了websocket之外 我觉得大部分人都会选择这样的方案.. 只是无法取值 可能是部分语法错误而已..

可惜万万没想到.. LZ采用的这种方式..

你不去请求 你以为页面用一个<%= 就可以自动取值了??

这就是你所谓的"前台调用后台方法"? 可笑至极....

另外 就算你new了一个class  里面循环一下sleep一下.

难道你不知道 "html"页面都是在这些东西都执行完毕的情况下 你才能看到?

我虽然不是很懂asp.net的运行机制..但是这最起码的页面周期.你应该懂吧.

#7


引用 5 楼 sp1234 的回复:
有时候有人会说什么“js调用asp.net”,或者什么“前端调用后端代码”,这就要看看他是否懂得基本的web机制。


要是都知道了,还发什么贴哦,要是每个人都知道了,就不需要论坛了哈!不知道你上面的话对发贴的人有什么帮住?why?

#8


#6楼的话受教了,虽然没有把原理的东西说明白,但至少为别人指明了一点方向。感谢!

#9


ajax访问后台,获取值,然后操作前台dom元素。

#10


void page_load(o,e)
{
 if !page.ispostback
  if reuetst["ajax"]=="1"
    var xxx=你取值的地方.
    resp.write(xxx);
    resp.end();
}
还是不行,我说的是实时。我在这里改变一次,前台获取一次是改变后的新值。你这里必须是运行了 resp.end()后才会返回值,也就是整个页面运行完成,也就是你说的页面生命周期结束了才返回值。我要的并不是这样,我要的是这个页面的处理进度反馈给用户看到:比如在这个页面上要处理6个任务,那我for 6次循环,我需求的很简单,仅仅只需要返回给用户看到的是当时处理到第几个任务了,也就是只要返回任务的序号就行:alert('第N个已完成'),仅仅只要返回这个N

#11


        var mytime;
        var i = 0;
        function myfn() {
            i++;            
            var mytext = '<%=(string)Application["myuser"] %>';
            alert(mytext);        //说明,这个地方得到的值始终是初始的值
            if (i >= 20) clearInterval(mytime); 
        }


你这个得了解下webform的生命周期,你这个加载完后,这个值就不会再变了……除非你刷新页面

#12


我这个问题算是解决了,现给出源码,供有类似问题的朋友学习:
        var getText = "<%=MyStr %>";
        if (getText != "") {
            var split = getText.split(',');
            for (var i = 0; i < split.length; i++) {
                $.get("go.aspx?ajax=" + split[i], function (data) {
                    alert(data);
                })
            }
        }
感谢#6楼的提示,但跟题目还是有差距的,如题是不刷新页面获取到更新后的值。而以上代码调用ajax,虽然没有刷新调用页面,但刷新了被调用页面,也就是说非得使go.aspx页面结束再调用,这不就等于在刷新go.aspx页面吗?

#13


很多大神都建议你先了解一下"生命周期"...你为什么不去试试看呢?

现在你理解的东西 根本从本质上 就有误区..

所以我们无论在说什么 对你来说都是徒劳无功..而且你还听不进去..

至于你所谓的"6个任务"  是在周期之外的..

所以才会衍生出来timer ajax请求后台获取最新情况返回到前台啊.

如果都在一个"周期"内..那这样不也没意义了吗?

#14


按照各位大神的指导看了下 WebForm页面生命周期,文章写得很好,现跟大家一起分享下:http://www.cnblogs.com/liangxiaofeng/p/5620033.html,在这里表示感谢!

但是,问题好像依然没有得到解决,文章里说到页面必须返回才能输出,那么在这里跟大家共同探讨下:传值不是可以分按值传递和按引用传递吗,而按引用传递只要某一处改变了变量的值,那么这个变量在任何一处都是改变后的新值。那么问下,在网页里能否像按引用传递类似的方法呢?或者,有没有其他办法实现如题的要求呢?比如写入数据库再从数据库取出,能达到目的就行。谢谢!

#15


楼主不仅仅要了解什么是页面的生命周期,还要了解什么叫无状态。。。

#1


说不定是页面缓存 页面路径后面加个随机参数 go.aspx?r=' + Math.random() 大概这样的试一下

#2


你是get请求,有浏览器缓存吧?
设置Cache.SetNoStore()
不知道单词打对了没有,反正就是通知浏览器不要缓存

#3


引用 2 楼 starfd 的回复:
你是get请求,有浏览器缓存吧?
设置Cache.SetNoStore()
不知道单词打对了没有,反正就是通知浏览器不要缓存


还是不行,我把测试的代码放出来看看:
Default.aspx前台代码:
<div>
        <p onclick="go()">点击我到gotopage页面</p>
</div>
    <script type="text/javascript">
        function go() {
            window.location.href = "gotopage.aspx";
        }
        var mytime;
        var i = 0;
        function myfn() {
            i++;            
            var mytext = '<%=(string)Application["myuser"] %>';
            alert(mytext);        //说明,这个地方得到的值始终是初始的值
            if (i >= 20) clearInterval(mytime); 
        }
        mytime = setInterval(myfn, 1000);
    </script>

Default.aspx后台代码:
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Cache.SetNoStore();
        Application["myuser"] = "初始值....";
    }

gotopage.aspx前台代码没有,后台代码:
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Cache.SetNoStore();
        Mycls newcls = new Mycls();
    }

Mycls.cs代码:
public class Mycls
{
public Mycls()
{
//
//TODO: 在此处添加构造函数逻辑
//

        for (int i = 0; i <= 20; i++)
        {
            System.Threading.Thread.Sleep(2000);  //间隔2秒钟
            myprocess();
        }  
}


    private void myprocess() {        
        HttpContext.Current.Application.Set("myuser", "新的值...");    
    }
}

以上就是所有的代码了,帮忙看下,谢谢!

#4


            var mytext = '<%=(string)Application["myuser"] %>';
            alert(mytext);        //说明,这个地方得到的值始终是初始的值


晕死!你贴出 aspx 页面输出到浏览器端的 html 源码!调试要以实际的原理为准,不是以虚幻的概念(什么js调用asp.net纯粹是假话)为依据。

#5


有时候有人会说什么“js调用asp.net”,或者什么“前端调用后端代码”,这就要看看他是否懂得基本的web机制。

#6


看到你的标题 我马上有一个解决方案就是ajax

大概就是(手写有误)


var n=3;
setInterval(function(){
 $.get("xxxx.aspx?ajax=1",function(data){
      alert(data);
  })
},1000*N);



void page_load(o,e)
{
 if !page.ispostback
  if reuetst["ajax"]=="1"
    var xxx=你取值的地方.
    resp.write(xxx);
    resp.end();
}



除了websocket之外 我觉得大部分人都会选择这样的方案.. 只是无法取值 可能是部分语法错误而已..

可惜万万没想到.. LZ采用的这种方式..

你不去请求 你以为页面用一个<%= 就可以自动取值了??

这就是你所谓的"前台调用后台方法"? 可笑至极....

另外 就算你new了一个class  里面循环一下sleep一下.

难道你不知道 "html"页面都是在这些东西都执行完毕的情况下 你才能看到?

我虽然不是很懂asp.net的运行机制..但是这最起码的页面周期.你应该懂吧.

#7


引用 5 楼 sp1234 的回复:
有时候有人会说什么“js调用asp.net”,或者什么“前端调用后端代码”,这就要看看他是否懂得基本的web机制。


要是都知道了,还发什么贴哦,要是每个人都知道了,就不需要论坛了哈!不知道你上面的话对发贴的人有什么帮住?why?

#8


#6楼的话受教了,虽然没有把原理的东西说明白,但至少为别人指明了一点方向。感谢!

#9


ajax访问后台,获取值,然后操作前台dom元素。

#10


void page_load(o,e)
{
 if !page.ispostback
  if reuetst["ajax"]=="1"
    var xxx=你取值的地方.
    resp.write(xxx);
    resp.end();
}
还是不行,我说的是实时。我在这里改变一次,前台获取一次是改变后的新值。你这里必须是运行了 resp.end()后才会返回值,也就是整个页面运行完成,也就是你说的页面生命周期结束了才返回值。我要的并不是这样,我要的是这个页面的处理进度反馈给用户看到:比如在这个页面上要处理6个任务,那我for 6次循环,我需求的很简单,仅仅只需要返回给用户看到的是当时处理到第几个任务了,也就是只要返回任务的序号就行:alert('第N个已完成'),仅仅只要返回这个N

#11


        var mytime;
        var i = 0;
        function myfn() {
            i++;            
            var mytext = '<%=(string)Application["myuser"] %>';
            alert(mytext);        //说明,这个地方得到的值始终是初始的值
            if (i >= 20) clearInterval(mytime); 
        }


你这个得了解下webform的生命周期,你这个加载完后,这个值就不会再变了……除非你刷新页面

#12


我这个问题算是解决了,现给出源码,供有类似问题的朋友学习:
        var getText = "<%=MyStr %>";
        if (getText != "") {
            var split = getText.split(',');
            for (var i = 0; i < split.length; i++) {
                $.get("go.aspx?ajax=" + split[i], function (data) {
                    alert(data);
                })
            }
        }
感谢#6楼的提示,但跟题目还是有差距的,如题是不刷新页面获取到更新后的值。而以上代码调用ajax,虽然没有刷新调用页面,但刷新了被调用页面,也就是说非得使go.aspx页面结束再调用,这不就等于在刷新go.aspx页面吗?

#13


很多大神都建议你先了解一下"生命周期"...你为什么不去试试看呢?

现在你理解的东西 根本从本质上 就有误区..

所以我们无论在说什么 对你来说都是徒劳无功..而且你还听不进去..

至于你所谓的"6个任务"  是在周期之外的..

所以才会衍生出来timer ajax请求后台获取最新情况返回到前台啊.

如果都在一个"周期"内..那这样不也没意义了吗?

#14


按照各位大神的指导看了下 WebForm页面生命周期,文章写得很好,现跟大家一起分享下:http://www.cnblogs.com/liangxiaofeng/p/5620033.html,在这里表示感谢!

但是,问题好像依然没有得到解决,文章里说到页面必须返回才能输出,那么在这里跟大家共同探讨下:传值不是可以分按值传递和按引用传递吗,而按引用传递只要某一处改变了变量的值,那么这个变量在任何一处都是改变后的新值。那么问下,在网页里能否像按引用传递类似的方法呢?或者,有没有其他办法实现如题的要求呢?比如写入数据库再从数据库取出,能达到目的就行。谢谢!

#15


楼主不仅仅要了解什么是页面的生命周期,还要了解什么叫无状态。。。