#c# #javascript #asp.net #ajaxcontroltoolkit
#c# #javascript #asp.net #ajaxcontroltoolkit
Вопрос:
Проблема, с которой я сталкиваюсь, заключается в том, что я передаю значения в javascript для рисования графика, используя значения сеанса в коде. Когда страница загружается, она принимает значение из сеанса и создает график, когда я выполняю частичную отправку обратно с помощью панели обновления и таймера, я вызываю метод для добавления значений в сеанс, и он это делает.
public void messsagePercentStats(object sender, EventArgs args)
{
...
if (value >= lowtarg amp;amp; 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" />
и метод timer_tick выполняется каждые 5 секунд
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 script, чтобы нарисовать график в post back, и он работает нормально.
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 использует последнее значение сеанса.
Комментарии:
1. Является ли этот javascript внутри ContentTemplate вашей панели обновления?
Ответ №1:
Я думаю, что эта ситуация такая же, как упоминалось в этом сообщении http://jquerybyexample.blogspot.com/2010/07/jquery-does-not-work-properly-after.html
Вы можете попробовать функцию pageLoad(), которая доступна при использовании ASP.NET АЯКС
Ответ №2:
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);
}
}
Ответ №3:
если вы используете скрипт на стороне сервера (<%= your stuff %>), вам нужно будет убедиться, что он выполняется на стороне сервера при каждой частичной обратной публикации. Я думаю, проблема в том, что вы снова и снова выполняете одну и ту же функцию скрипта (загруженную впервые) при каждом частичном возврате. Попробуйте зарегистрировать всю функцию при каждом частичном возврате, а не только вызывать функцию… Я программист 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)
*** Я не тестировал это, но дайте мне знать, если я должен внести какие-либо изменения