如何更新部分回发的会话值以及如何使Javascript使用新值

时间:2011-10-04 12:11:46

标签: c# javascript asp.net ajaxcontroltoolkit

我面临的问题是我将值传递给javascript以使用后面的代码中的会话值绘制图形。当页面加载时,它从会话中获取值并创建图形,当我使用更新面板和计时器进行部分回发时,我调用该方法向会话添加值并执行它。

public void messsagePercentStats(object sender, EventArgs args)
    {
     ...
       if (value >= lowtarg && value < Toptarg)
            {
                vProgressColor = "'#eaa600'";
            }
            else if (value >= Toptarg)
            {
                vProgressColor = "'#86cf21'";
            }
            Session.Add("vProgressColor", vProgressColor);
            Session.Add("vProgressPercentage", "["+value+"],["+remaining+"]");
             }
     }

我使用更新面板调用上面的方法

<asp:ScriptManager ID="smCharts" runat="server" />

        <asp:UpdatePanel runat="server" ID="Holder" OnLoad="messsagePercentStats" UpdateMode="Conditional">
            <ContentTemplate>
 <asp:Timer ID="Timer1" runat="server" Interval="5000" OnTick="Timer_Tick" />

并且每5秒执行一次timer_tick方法

protected void Timer_Tick(object sender, EventArgs args)
    {            
          ScriptManager.RegisterStartupScript(this, this.GetType(), "key", "r.init();", true);
          ResponseMetric rm = new ResponseMetric(); 
        Holder.Update();        
    }

我使用ScriptManager.RegisterStartupScript(this, this.GetType(), "key", "r.init();", true); 调用r.init() Java脚本方法在帖子后面绘制图形,它工作正常。

Java脚本:

 var r = {  
        init : function(){  
   r = Raphael("pie"),

                    data2 = [<%= Session["vProgressPercentage"] %>];
                    axisx = ["10%", "20%"];
            r.g.txtattr.font = "12px 'Fontin Sans', Fontin-Sans, sans-serif";
             r.g.barchart(80, 25, 100, 320, data2, { stacked: true, colors: [<%= Session["vProgressColor"] %>,'#fff'] });
             axis2 = r.g.axis(94, 325, 280, 0, 100, 10, 1);
        }
        }
          window.onload = function () {
          r.init();
        };

此Java脚本未从会话中获取新值,它在加载页面时使用旧值。如何更改代码以确保JS使用最新的会话值。

3 个答案:

答案 0 :(得分:0)

我认为这种情况与本文中提到的相同 http://jquerybyexample.blogspot.com/2010/07/jquery-does-not-work-properly-after.html

您可以尝试使用ASP.NET AJAX时可用的pageLoad()函数

答案 1 :(得分:0)

protected void Timer_Tick(object sender, EventArgs args)
{            
      ScriptManager.RegisterStartupScript(this, this.GetType(), "key", 
         "r.init('"+ Session["vProgressPercentage"]  +"','"+ Session["vProgressColor"] +"');", true);
      ResponseMetric rm = new ResponseMetric(); 
      Holder.Update();        
}


var r = {  
    init : function(vProgressPercentage, vProgressColor){  
        r = Raphael("pie"),

        data2 = [vProgressPercentage];
        axisx = ["10%", "20%"];
        r.g.txtattr.font = "12px 'Fontin Sans', Fontin-Sans, sans-serif";
        r.g.barchart(80, 25, 100, 320, data2, { stacked: true, colors: vProgressColor,'#fff'] });
         axis2 = r.g.axis(94, 325, 280, 0, 100, 10, 1);
       }
    }

答案 2 :(得分:-1)

如果您使用服务器端脚本(&lt;%= 您的东西%&gt;),您将拥有 确保它在每个部分帖子后面的服务器端运行。我认为 问题是你正在执行相同的脚本功能(首先 每次部分回复,一次又一次地下载时间。尝试 用每个部分后置而不是注册整个函数 只调用函数...我是VB程序员

Private _strObj as String = "var r = { init : function(){ ...data2 = ["+Session("vProgressPercentage")+"]; ...}} r.init()"

ScriptManager.RegisterStartupScript(Me.Page, Me.GetType, Guid.NewGuid.ToString, _strObj , true)

***我没有对此进行过测试,但请告诉我是否应该进行任何更改