簡體   English   中英

從javascript調用ac#.net函數

[英]calling a c#.net function from javascript

我正在使用C#.net創建一個應用程序。

我試圖在數據庫中的數據更新后立即更新頁面。
我已將數據庫中的一個值存儲在一個標簽中,並且每次在另一個標簽中存儲相同的值時,我都會調用一個函數,此后,我將兩個標簽進行比較。
該代碼是

我的webpage.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();
     }

但是有一個問題,當我在后面調用函數代碼時,它正在執行整個后端代碼,因此兩個標簽的值會同時更新。

我只想每次都調用函數背后的代碼,並且只想更新一次label2的值。

有人可以告訴我我該怎么做。

您無法從JavaScript調用C#函數-如果可能,請想象那些懷有惡意的人可以做什么?

您需要在此處使用Ajax,然后從您的Web表單中發布/獲取信息。

您的JavaScript代碼除了重新加載頁面外什么也不做-這意味着將執行整個頁面加載周期,因此為什么要執行所有代碼。 您還將混淆客戶端和服務器端代碼,並誤解ASPX引擎如何呈現其內容。

為我的Ajax使用了JQuery (您可以不使用JQuery ,但JQuery可以使它更快,更簡單),但是您還需要使Ajax調用可以訪問您的函數。 使用回調來更新標簽:

  $.ajax({
          url: "/url/to/your/post/page"
         }).done(function ( data ) {
                    // Check validity of "data"
                      $("#label2").val("Updated!"); 
        });

值得注意的是,您可以做更多的事情。 請參閱我的鏈接獲取$ ajax()文檔。

就“ / url /至/您的/帖子/頁面”而言,由於您使用的是Web表單,因此需要創建一個頁面,以將正確的內容返回給您的Ajax函數。 我稍后會發布更多信息。

您真的需要先弄清JavaScript和C#之間的區別,然后再嘗試執行與定時AJAX回調一樣復雜的事情-在HTML輸出到客戶端之前呈現<%=%>標簽,並且客戶端絕對看不到您的C#類或其方法。

首先,您需要確定您的方法。 這可以通過兩種方式完成。

  1. 保持每隔x秒輪詢服務器一次,以查看該值是否更改。 為此,您可以使用AJAX調用AJAX Web服務PageMethods 在這兩種情況下,您都無法訪問頁面中的控件。 如果要訪問控件,則會觸發整個頁面事件生命周期(這是當前的問題)。

  2. 使您的服務器向您的客戶端發送信號,指示值已更改。 這可以通過各種技術來完成。 最好的方法是使用SignalR庫。

使用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()中刪除此行

setTimeout("location.reload(true);", 60000);

希望能幫助到你 :)

如果要通過使用ASP.NET AJAX來實現此目的,則可以使用UpdatePanel和Timer控件,這是一個教程教程:如何以一定的時間間隔刷新UpdatePanel控件,否則可以使用jQuery Ajax。

嘗試使用Page.IsPostBack屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM