无法将值从 C# 传递到 amcharts JavaScript 函数
Unable to pass value from C# to amcharts JavaScript function
我在 amCharts 的帮助下创建了一个图表,显示了他们网站上示例的温度。图表显示正确。
现在我正在使用 C# 从数据库中获取温度,并且我正在尝试将该值传递给对温度进行硬编码的函数,因此我获得了动态值。然而,我刚拿到图表,指针仍为 0,不显示温度。
到目前为止我已经尝试了3种方法:
- 我使用了一个隐藏字段,在 C# 中将值分配给隐藏字段并调用了显示图表的 JavaScript 函数。它只显示图表。针不换。
我用了脚本管理器和Web API,(我不懂Web API,只是用网上的代码),结果是一样的,但是c#中的函数不断被调用。
我将整个 amCharts 代码放在一个 JavaScript 函数中。我在 c# 中获得了值,然后使用
String script = "window.onload = function() { UpdateTemp('" + dt.Rows[0][0].ToString()+ "'); };";
ClientScript.RegisterStartupScript(this.GetType(), "UpdateTemp", script, true);
再次显示相同的结果,地图显示指针停留在 0。
这是我的第三种方法的代码:
ASPX 页面,JavaScript 函数
<script>
function UpdateTemp(temp) {
am4core.ready(function() {
// Themes begin
am4core.useTheme(am4themes_animated);
// Themes end
// create chart
var chart = am4core.create("chartdiv", am4charts.GaugeChart);
chart.hiddenState.properties.opacity = 0; // this makes initial fade in effect
chart.innerRadius = -25;
var axis = chart.xAxes.push(new am4charts.ValueAxis());
axis.min = 0;
axis.max = 100;
axis.strictMinMax = true;
axis.renderer.grid.template.stroke = new am4core.InterfaceColorSet().getFor("background");
axis.renderer.grid.template.strokeOpacity = 0.3;
var colorSet = new am4core.ColorSet();
var range0 = axis.axisRanges.create();
range0.value = 0;
range0.endValue = 50;
range0.axisFill.fillOpacity = 1;
range0.axisFill.fill = colorSet.getIndex(0);
range0.axisFill.zIndex = - 1;
var range1 = axis.axisRanges.create();
range1.value = 50;
range1.endValue = 80;
range1.axisFill.fillOpacity = 1;
range1.axisFill.fill = colorSet.getIndex(2);
range1.axisFill.zIndex = -1;
var range2 = axis.axisRanges.create();
range2.value = 80;
range2.endValue = 100;
range2.axisFill.fillOpacity = 1;
range2.axisFill.fill = colorSet.getIndex(4);
range2.axisFill.zIndex = -1;
var hand = chart.hands.push(new am4charts.ClockHand());
// using chart.setTimeout method as the timeout will be disposed together with a chart
chart.setTimeout(randomValue, 2000);
function randomValue(temp) {
hand.showValue(temp, 1000, am4core.ease.cubicOut);
chart.setTimeout(randomValue, 2000);
}
}); // end am4core.ready()
};
</script>
C#函数获取温度并调用JavaScript函数
public void BindGrid(String charttype)
{
string constring = "Data Source=********.DOMAIN.ORG01;Initial Catalog=Temperature;Integrated Security=SSPI;";
using (SqlConnection con = new SqlConnection(constring))
{
using (SqlCommand cmd = new SqlCommand("SELECT Temperature,HighestPoint,LowestPoint FROM Temperature", con))
{
cmd.CommandType = CommandType.Text;
con.Open();
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
temp1.Value = dt.Rows[0][0].ToString();
con.Close();
String script = "window.onload = function() { UpdateTemp('" + dt.Rows[0][0].ToString()+ "'); };";
ClientScript.RegisterStartupScript(this.GetType(), "UpdateTemp", script, true);
}
}
}
质量代码应该修改,但我设法让它工作。
我做了 2 处更改:
- 1 : 我使用了 "PageLoad" 方法而不是 "BindGrid" (你真的需要这个吗?)
- 2 :我直接将原始温度值作为参数填充(因为它是我这边的浮点数),您用简单的引号将数据行值包含在内,javascript 和方法将其解释为字符串"showValue" 来自 "hand" 似乎不能容忍它。
代码:
结果:
改进代码的一些想法:
- 将您的连接字符串放入配置文件中(永远不要放在代码中!)
- 如果您使用 "using" 调用资源的方法 "close" 无关紧要,它会自动调用它。 (在使用它的背后实际上是一个 try-catch-finally,无论如何都会在 finally 中调用 close ;))
- 如果可能的话,将数据访问与渲染页面分开,创建一个单独的 class 来管理它,这将提高代码的可读性和改进。
- 如果变量"temp1"没有用到,直接去掉即可。
- 当您获取数据(无论来源如何,可能是网络服务或数据库或其他)时,在访问它并记录它之前检查总是它是否为空,它不会花费很多,您可以避免异常升级。
- 现在是 2019 年,您可以使用 Dapper 从查询中直接获取对象而不是通用数据行。 (如果有兴趣,请查看网站,他们有很多有趣的教程)。
氪,
阿里
我在 amCharts 的帮助下创建了一个图表,显示了他们网站上示例的温度。图表显示正确。
现在我正在使用 C# 从数据库中获取温度,并且我正在尝试将该值传递给对温度进行硬编码的函数,因此我获得了动态值。然而,我刚拿到图表,指针仍为 0,不显示温度。
到目前为止我已经尝试了3种方法:
- 我使用了一个隐藏字段,在 C# 中将值分配给隐藏字段并调用了显示图表的 JavaScript 函数。它只显示图表。针不换。
我用了脚本管理器和Web API,(我不懂Web API,只是用网上的代码),结果是一样的,但是c#中的函数不断被调用。
我将整个 amCharts 代码放在一个 JavaScript 函数中。我在 c# 中获得了值,然后使用
String script = "window.onload = function() { UpdateTemp('" + dt.Rows[0][0].ToString()+ "'); };"; ClientScript.RegisterStartupScript(this.GetType(), "UpdateTemp", script, true);
再次显示相同的结果,地图显示指针停留在 0。
这是我的第三种方法的代码:
ASPX 页面,JavaScript 函数
<script>
function UpdateTemp(temp) {
am4core.ready(function() {
// Themes begin
am4core.useTheme(am4themes_animated);
// Themes end
// create chart
var chart = am4core.create("chartdiv", am4charts.GaugeChart);
chart.hiddenState.properties.opacity = 0; // this makes initial fade in effect
chart.innerRadius = -25;
var axis = chart.xAxes.push(new am4charts.ValueAxis());
axis.min = 0;
axis.max = 100;
axis.strictMinMax = true;
axis.renderer.grid.template.stroke = new am4core.InterfaceColorSet().getFor("background");
axis.renderer.grid.template.strokeOpacity = 0.3;
var colorSet = new am4core.ColorSet();
var range0 = axis.axisRanges.create();
range0.value = 0;
range0.endValue = 50;
range0.axisFill.fillOpacity = 1;
range0.axisFill.fill = colorSet.getIndex(0);
range0.axisFill.zIndex = - 1;
var range1 = axis.axisRanges.create();
range1.value = 50;
range1.endValue = 80;
range1.axisFill.fillOpacity = 1;
range1.axisFill.fill = colorSet.getIndex(2);
range1.axisFill.zIndex = -1;
var range2 = axis.axisRanges.create();
range2.value = 80;
range2.endValue = 100;
range2.axisFill.fillOpacity = 1;
range2.axisFill.fill = colorSet.getIndex(4);
range2.axisFill.zIndex = -1;
var hand = chart.hands.push(new am4charts.ClockHand());
// using chart.setTimeout method as the timeout will be disposed together with a chart
chart.setTimeout(randomValue, 2000);
function randomValue(temp) {
hand.showValue(temp, 1000, am4core.ease.cubicOut);
chart.setTimeout(randomValue, 2000);
}
}); // end am4core.ready()
};
</script>
C#函数获取温度并调用JavaScript函数
public void BindGrid(String charttype)
{
string constring = "Data Source=********.DOMAIN.ORG01;Initial Catalog=Temperature;Integrated Security=SSPI;";
using (SqlConnection con = new SqlConnection(constring))
{
using (SqlCommand cmd = new SqlCommand("SELECT Temperature,HighestPoint,LowestPoint FROM Temperature", con))
{
cmd.CommandType = CommandType.Text;
con.Open();
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
temp1.Value = dt.Rows[0][0].ToString();
con.Close();
String script = "window.onload = function() { UpdateTemp('" + dt.Rows[0][0].ToString()+ "'); };";
ClientScript.RegisterStartupScript(this.GetType(), "UpdateTemp", script, true);
}
}
}
质量代码应该修改,但我设法让它工作。 我做了 2 处更改:
- 1 : 我使用了 "PageLoad" 方法而不是 "BindGrid" (你真的需要这个吗?)
- 2 :我直接将原始温度值作为参数填充(因为它是我这边的浮点数),您用简单的引号将数据行值包含在内,javascript 和方法将其解释为字符串"showValue" 来自 "hand" 似乎不能容忍它。
代码:
结果:
改进代码的一些想法:
- 将您的连接字符串放入配置文件中(永远不要放在代码中!)
- 如果您使用 "using" 调用资源的方法 "close" 无关紧要,它会自动调用它。 (在使用它的背后实际上是一个 try-catch-finally,无论如何都会在 finally 中调用 close ;))
- 如果可能的话,将数据访问与渲染页面分开,创建一个单独的 class 来管理它,这将提高代码的可读性和改进。
- 如果变量"temp1"没有用到,直接去掉即可。
- 当您获取数据(无论来源如何,可能是网络服务或数据库或其他)时,在访问它并记录它之前检查总是它是否为空,它不会花费很多,您可以避免异常升级。
- 现在是 2019 年,您可以使用 Dapper 从查询中直接获取对象而不是通用数据行。 (如果有兴趣,请查看网站,他们有很多有趣的教程)。
氪, 阿里