我在项目中定义了一个全局变量,这个全局变量不管你用的是什么,能达到目的就行:我尝试过的有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()
不知道单词打对了没有,反正就是通知浏览器不要缓存
设置Cache.SetNoStore()
不知道单词打对了没有,反正就是通知浏览器不要缓存
#3
还是不行,我把测试的代码放出来看看:
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纯粹是假话)为依据。
alert(mytext); //说明,这个地方得到的值始终是初始的值
晕死!你贴出 aspx 页面输出到浏览器端的 html 源码!调试要以实际的原理为准,不是以虚幻的概念(什么js调用asp.net纯粹是假话)为依据。
#5
有时候有人会说什么“js调用asp.net”,或者什么“前端调用后端代码”,这就要看看他是否懂得基本的web机制。
#6
看到你的标题 我马上有一个解决方案就是ajax
大概就是(手写有误)
除了websocket之外 我觉得大部分人都会选择这样的方案.. 只是无法取值 可能是部分语法错误而已..
可惜万万没想到.. LZ采用的这种方式..
你不去请求 你以为页面用一个<%= 就可以自动取值了??
这就是你所谓的"前台调用后台方法"? 可笑至极....
另外 就算你new了一个class 里面循环一下sleep一下.
难道你不知道 "html"页面都是在这些东西都执行完毕的情况下 你才能看到?
我虽然不是很懂asp.net的运行机制..但是这最起码的页面周期.你应该懂吧.
大概就是(手写有误)
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
要是都知道了,还发什么贴哦,要是每个人都知道了,就不需要论坛了哈!不知道你上面的话对发贴的人有什么帮住?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
{
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的生命周期,你这个加载完后,这个值就不会再变了……除非你刷新页面
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页面吗?
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请求后台获取最新情况返回到前台啊.
如果都在一个"周期"内..那这样不也没意义了吗?
现在你理解的东西 根本从本质上 就有误区..
所以我们无论在说什么 对你来说都是徒劳无功..而且你还听不进去..
至于你所谓的"6个任务" 是在周期之外的..
所以才会衍生出来timer ajax请求后台获取最新情况返回到前台啊.
如果都在一个"周期"内..那这样不也没意义了吗?
#14
按照各位大神的指导看了下 WebForm页面生命周期,文章写得很好,现跟大家一起分享下:http://www.cnblogs.com/liangxiaofeng/p/5620033.html,在这里表示感谢!
但是,问题好像依然没有得到解决,文章里说到页面必须返回才能输出,那么在这里跟大家共同探讨下:传值不是可以分按值传递和按引用传递吗,而按引用传递只要某一处改变了变量的值,那么这个变量在任何一处都是改变后的新值。那么问下,在网页里能否像按引用传递类似的方法呢?或者,有没有其他办法实现如题的要求呢?比如写入数据库再从数据库取出,能达到目的就行。谢谢!
但是,问题好像依然没有得到解决,文章里说到页面必须返回才能输出,那么在这里跟大家共同探讨下:传值不是可以分按值传递和按引用传递吗,而按引用传递只要某一处改变了变量的值,那么这个变量在任何一处都是改变后的新值。那么问下,在网页里能否像按引用传递类似的方法呢?或者,有没有其他办法实现如题的要求呢?比如写入数据库再从数据库取出,能达到目的就行。谢谢!
#15
楼主不仅仅要了解什么是页面的生命周期,还要了解什么叫无状态。。。
#1
说不定是页面缓存 页面路径后面加个随机参数 go.aspx?r=' + Math.random() 大概这样的试一下
#2
你是get请求,有浏览器缓存吧?
设置Cache.SetNoStore()
不知道单词打对了没有,反正就是通知浏览器不要缓存
设置Cache.SetNoStore()
不知道单词打对了没有,反正就是通知浏览器不要缓存
#3
还是不行,我把测试的代码放出来看看:
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纯粹是假话)为依据。
alert(mytext); //说明,这个地方得到的值始终是初始的值
晕死!你贴出 aspx 页面输出到浏览器端的 html 源码!调试要以实际的原理为准,不是以虚幻的概念(什么js调用asp.net纯粹是假话)为依据。
#5
有时候有人会说什么“js调用asp.net”,或者什么“前端调用后端代码”,这就要看看他是否懂得基本的web机制。
#6
看到你的标题 我马上有一个解决方案就是ajax
大概就是(手写有误)
除了websocket之外 我觉得大部分人都会选择这样的方案.. 只是无法取值 可能是部分语法错误而已..
可惜万万没想到.. LZ采用的这种方式..
你不去请求 你以为页面用一个<%= 就可以自动取值了??
这就是你所谓的"前台调用后台方法"? 可笑至极....
另外 就算你new了一个class 里面循环一下sleep一下.
难道你不知道 "html"页面都是在这些东西都执行完毕的情况下 你才能看到?
我虽然不是很懂asp.net的运行机制..但是这最起码的页面周期.你应该懂吧.
大概就是(手写有误)
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
要是都知道了,还发什么贴哦,要是每个人都知道了,就不需要论坛了哈!不知道你上面的话对发贴的人有什么帮住?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
{
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的生命周期,你这个加载完后,这个值就不会再变了……除非你刷新页面
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页面吗?
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请求后台获取最新情况返回到前台啊.
如果都在一个"周期"内..那这样不也没意义了吗?
现在你理解的东西 根本从本质上 就有误区..
所以我们无论在说什么 对你来说都是徒劳无功..而且你还听不进去..
至于你所谓的"6个任务" 是在周期之外的..
所以才会衍生出来timer ajax请求后台获取最新情况返回到前台啊.
如果都在一个"周期"内..那这样不也没意义了吗?
#14
按照各位大神的指导看了下 WebForm页面生命周期,文章写得很好,现跟大家一起分享下:http://www.cnblogs.com/liangxiaofeng/p/5620033.html,在这里表示感谢!
但是,问题好像依然没有得到解决,文章里说到页面必须返回才能输出,那么在这里跟大家共同探讨下:传值不是可以分按值传递和按引用传递吗,而按引用传递只要某一处改变了变量的值,那么这个变量在任何一处都是改变后的新值。那么问下,在网页里能否像按引用传递类似的方法呢?或者,有没有其他办法实现如题的要求呢?比如写入数据库再从数据库取出,能达到目的就行。谢谢!
但是,问题好像依然没有得到解决,文章里说到页面必须返回才能输出,那么在这里跟大家共同探讨下:传值不是可以分按值传递和按引用传递吗,而按引用传递只要某一处改变了变量的值,那么这个变量在任何一处都是改变后的新值。那么问下,在网页里能否像按引用传递类似的方法呢?或者,有没有其他办法实现如题的要求呢?比如写入数据库再从数据库取出,能达到目的就行。谢谢!
#15
楼主不仅仅要了解什么是页面的生命周期,还要了解什么叫无状态。。。