【问题标题】:Call a C# method in time interval from javascript从 javascript 在时间间隔内调用 C# 方法
【发布时间】:2016-03-10 08:38:40
【问题描述】:

我正在从 javascript 中调用一个 C# 方法,该方法将返回一个 Json 字符串。我正在文本框中编写 JSON 值。 C# 方法将数据表转换为 JSON。到目前为止,它工作正常。

<script type="text/javascript">
        function initialize() {
   //returns "[{\"TAG1\":100,\"TAG2\":100}]" from method 
   var data = JSON.parse('<%=ConvertDataTabletoString()%>'); 
   $('#TextBox1').val(data[0].TAG1);
   $('#TextBox2').val(data[0].TAG2);
   }
    </script>

后面的代码

public string ConvertDataTabletoString()
{
    string strcon = ConfigurationManager.ConnectionStrings["SqlCon"].ConnectionString;
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection(strcon))
    {
        using (SqlCommand cmd = new SqlCommand(
          @"SELECT TOP 1 
                   DATATIME, 
                   TAG1,
                   TAG2 
              FROM DATATABLE1  
          ORDER BY 1 DESC", con))
        {
            con.Open();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            System.Web.Script.Serialization.JavaScriptSerializer serializer = 
              new System.Web.Script.Serialization.JavaScriptSerializer();

            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row;
            foreach (DataRow dr in dt.Rows)
            {
                row = new Dictionary<string, object>();
                foreach (DataColumn col in dt.Columns)
                {
                    row.Add(col.ColumnName, dr[col]);
                }
                rows.Add(row);
            }

            return serializer.Serialize(rows);
        }
    }
}

但我想在特定的时间间隔(我的情况下为 3 秒)更新文本框值,以便在文本框中获取最新的数据表值 所以尝试了 setInterval 函数。但它不会更新最新值。

<script type="text/javascript">
        setInterval(function initialize() {
            //returns "[{\"TAG1\":100,\"TAG2\":100}]"     
            var data = JSON.parse('<%=ConvertDataTabletoString() %>');
            $('#TextBox1').val(data[0].TAG1);
            $('#TextBox2').val(data[0].TAG2);
        },1000);
    </script>

这个问题有什么解决办法吗?建议每 3 秒从 java 脚本调用一个方法吗?或任何其他方式在文本框中获取最新的数据表值?

【问题讨论】:

  • “我正在从 javascript 调用 C# 方法。” 不,你不是。当页面被请求时,您正在在服务器上运行一个 C# 方法,然后,一旦页面文本(其中嵌入了该方法的输出)到达客户端,浏览器就会运行读取嵌入在页面中的文本的 JavaScript 代码。
  • @T.J.Crowder 你有问题。完成它的可能解决方案是什么?
  • 创建一个端点并使用ajax调用该方法,然后再次设置值。其他可能的解决方案,我真的不推荐,但我假设你正在使用 WebForms,是设置一个更新面板和一个计时器来刷新

标签: javascript c# jquery asp.net json


【解决方案1】:

将 WebService (.asmx) 添加到您的项目中。

然后将您的方法作为 WebMethod 添加到服务中:

namespace YourName.Space
{
 //Here is some auto-generated stuff like [WebService(Namespace = "http//tempuri.org")]
 public class MyWebsevice : System.Web.Services.WebService
 {
  [WebMethod]
  public string ConvertDataTabletoString()
  {
   // your stuff
  }
 }
}

在您的页面上注册 Web 服务:

<asp:ScriptManager ID="ScriptManager" runat="server">
 <Services>
  <asp:ServiceReference Path="~/MyWebsevice.asmx" />
 </Services>
</asp:ScriptManager>

从 JS 调用它:

<script type="text/javascript">
    $(document).ready(function(){
     setInterval(LoadMyData, 3000);
    });

    function LoadMyData() {
     YourName.Space.MyWebsevice.ConvertDataTabletoString(onSuccess, onFailure)
    }

    function onSuccess(result) {
     var data = JSON.parse(result);
     $('#TextBox1').val(data[0].TAG1);
     $('#TextBox2').val(data[0].TAG2);
    }

    function onFailure(result, userContext, methodName) {
     // do something if necessary.
    }
</script>

希望对你有帮助。

编辑:使用 OnLoad="myOnLoadFunction()" 代替“$(document).ready()”

var var1;
function myOnLoadFunction(){
 var1= setInterval(LoadMyData, 3000);
}

致电&lt;body onload="myOnLoadFunction()"&gt;

【讨论】:

  • 值不会传递给文本框。它显示空值。需要更改什么吗?
  • 你调试过服务和JS吗?
  • Web 服务返回正确的 json 值。但是JS没有收到
  • 进入onSuccess还是onFailure?结果的价值是什么?
  • LoadMyData 函数没有被触发..,如果可以的话你可以看看我的代码..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多