从javascript调用c#.net函数

从javascript调用c#.net函数,c#,javascript,asp.net,C#,Javascript,Asp.net,我正在使用C#.net创建应用程序。 数据库中的数据一更新,我就试图更新我的页面。 我已将数据库中的一个值存储在一个标签中,每次我都调用一个函数,该函数将相同的值存储在另一个标签中,然后我将两个标签进行比较。代码为 我的网页是.aspx.cs public partial class _Default : System.Web.UI.Page { SqlConnection con = new SqlConnection(); protected void Page_Load(o

我正在使用C#.net创建应用程序。

数据库中的数据一更新,我就试图更新我的页面。
我已将数据库中的一个值存储在一个标签中,每次我都调用一个函数,该函数将相同的值存储在另一个标签中,然后我将两个标签进行比较。
代码为

我的网页是.aspx.cs

public partial class _Default : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection();
    protected void Page_Load(object sender, EventArgs e)
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["cn"].ConnectionString;
        if (con.State == System.Data.ConnectionState.Closed)
        {
            con.Open();
        }
        SqlDataAdapter adp = new SqlDataAdapter("SELECT name from Master where id= 10"), con);
        DataSet ds = new DataSet();
        adp.Fill(ds);
        Label2.Text = Convert.ToString(ds1);
    }
    protected String CodeBehind()
    {
        SqlDataAdapter adp = new SqlDataAdapter("SELECT name from Master where id= 10"), con);
        DataSet ds = new DataSet();
        adp.Fill(ds);
        String ds2 = Convert.ToString(ds1);
        return (ds2);
    }
    protected int compare()
    {
        string abc = Label2.Text;
        string abcd = Label3.Text;
        if (abc == abcd)
        { 
            return(0);
        }
        else
        {
            return (1);
        }
     }
 }
我的前端javascript代码是

 <script type="text/JavaScript">
    function AutoRefresh() {
        document.getElementById('<%= Label3.ClientID %>').innerHTML = '<%= CodeBehind() %>';
        var res = '<%= compare() %>'
        if ( res == 1) {
            alert("same");
            setTimeout("location.reload(true);", 60000);
        }
        else {
         alert("different")
             abx();
         }
     }
     function abx() {
         AutoRefresh();
     }

函数AutoRefresh(){
document.getElementById(“”).innerHTML=“”;
var res=''
如果(res==1){
警惕(“相同”);
setTimeout(“location.reload(true);”,60000);
}
否则{
警报(“不同”)
abx();
}
}
函数abx(){
自动刷新();
}
但是有一个问题,当我调用codebehind函数时,它正在执行整个后端代码,因此两个标签的值会同时更新。

我只想每次调用代码隐藏函数,只想更新label2的值一次。

有人能告诉我怎么做吗。

你不能从JavaScript调用C函数-如果可能的话,想象一下那些有恶意的人会怎么做

您需要在这里使用Ajax,并从web表单发布/获取信息

JavaScript代码除了重新加载页面外什么都不做——这意味着将发生一个完整的页面加载周期,因此所有代码都在执行。您还混淆了客户端和服务器端代码,并且误解了ASPX引擎如何呈现其内容

我使用(您可以不使用JQuery,但是JQuery使它变得更快更容易),但是您还需要通过Ajax调用来访问您的函数。使用回调更新标签:

  $.ajax({
          url: "/url/to/your/post/page"
         }).done(function ( data ) {
                    // Check validity of "data"
                      $("#label2").val("Updated!"); 
        });
值得注意的是,你可以做更多的事情。有关$ajax()文档,请参见我的链接

就“/url/to/your/post/page”而言,由于您使用的是web表单,因此需要创建一个将正确内容返回到ajax函数的页面。稍后我会发布更多信息


你真的需要弄清楚JavaScript和C#之间的区别,首先,在你尝试做像定时AJAX回调这样复杂的事情之前——你的标记在HTML输出到客户端之前呈现,而且客户端完全看不到您的C#类或其方法。

请尝试使用Page.IsPostBack属性。

首先,您需要确定您的方法。这可以通过两种方式实现

  • 保持每隔
    x
    秒轮询服务器一次,以查看值是否更改。为此,可以使用AJAX调用a或a。在这两种情况下,您都无法访问页面中的控件。如果要访问控件,将触发整个页面事件生命周期(这是您当前的问题)

  • 使您的服务器向您的客户端发出信号,表示该值已更改。这可以通过各种技术来实现。最好的方法是使用图书馆


  • 使用SignalR将帮助您轻松扩展应用程序。

    相应地更新代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            con.ConnectionString = ConfigurationManager.ConnectionStrings["cn"].ConnectionString;
            if (con.State == System.Data.ConnectionState.Closed)
            {
            con.Open();
            }
    
            Label2.Text = CodeBehind();
        }
    }
    
    protected String CodeBehind()
    {
        SqlDataAdapter adp = new SqlDataAdapter("SELECT name from Master where id= 10"), con);
        DataSet ds = new DataSet();
        adp.Fill(ds);
        String ds2 = Convert.ToString(ds1);        
        return (ds2);
    }
    
    并从函数AutoRefresh()中删除该行


    希望对您有所帮助:)

    如果您想通过使用ASP.NET AJAX实现这一点,您可以使用UpdatePanel和计时器控件,下面是一个教程,否则您可以使用jQuery AJAX。

    当您调用abx()时,会在AutoRefresh()中创建一个无限(永无止境)循环;看来你需要AJAX@sajanyamaha我希望页面定期检查数据库中的任何更新,这就是我使用此循环的原因如果要刷新整个页面,为什么需要存储以前的值和更新的值,然后进行比较?为什么你不能在没有逻辑的情况下刷新页面,这会给你更新的值。不过,你对浏览器(客户端)如何与服务器交互感到非常困惑。请参阅Spikh的答案。值得注意的是,如果没有更复杂的推/拉实现,您的页面将不会在数据库中发生更改时立即更新。您必须每隔一段时间进行ajax调用,以检查是否有更新的值,因此本质上,您将有大量不必要的ajax请求,尤其是在数据库不经常更新的情况下。是的,如果您需要让服务器控制您的客户机,那么SignalIR就是一种方法,由于JS/C#实现会变得非常复杂,非常快。很抱歉,它仍然在调用CodeBehind()时再次执行整个代码。@user1852933:var res=''的结果是什么?我认为location.reload(true)导致了完整的回发,这就是Page#Load中的整个代码再次执行的原因。setTimeout(添加“location.reload(true);”,60000);行是为了每隔60秒检查数据库是否有更新。删除它不会解决问题,但codebehind()也会检查数据库是否有更改,您不需要重新加载页面,这将重置所有控件及其值。
    setTimeout("location.reload(true);", 60000);