0

C#.net を使用してアプリケーションを作成しています。

データベースのデータが更新されたらすぐにページを更新しようとしています。
データベースから 1 つの値を 1 つのラベルに格納し、同じ値を別のラベルに格納するたびに関数を呼び出し、その後 2 つのラベルを比較しています。
コードは

私の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 の値を一度だけ更新したいだけです。

どうすればそれができるか教えてください。

4

5 に答える 5

1

JavaScript から C# 関数を呼び出すことはできません。それが可能である場合、悪意のある人が何をできるか想像してみてください。

ここでは Ajax を使用し、Web フォームから情報を POST / GET する必要があります。

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/to/your/post/page」に関しては、Web フォームを使用しているため、正しいコンテンツを ajax 関数に返すページを作成する必要があります。後でもう少し情報を投稿します。

時間指定された AJAX コールバックのような複雑なことを試みる前に、最初に JavaScript と C# の違いを理解する必要があります。 <%=%> タグは、HTML がクライアントに出力される前にレンダリングされます。クライアントは、C# クラスまたはそのメソッドをまったく認識できません。

于 2013-01-07T06:19:36.573 に答える
0

まず、アプローチを特定する必要があります。これは2つの方法で行うことができます。

  1. サーバーを毎秒ポーリングしてx、値が変更されているかどうかを確認します。このために、AJAXWebサービスまたはPageMethodsのいずれかへのAJAX呼び出しを使用できます。どちらの場合も、ページのコントロールにアクセスすることはできません。コントロールにアクセスする場合は、ページイベントのライフサイクル全体がトリガーされます(これが現在の問題です)。

  2. 値が変更されたことをサーバーがクライアントに通知するようにします。これは、さまざまな手法で実行できます。最良の方法は、SignalRライブラリを使用することです。

SignalRを使用すると、アプリケーションを簡単にスケーリングできます。

于 2013-01-07T06:31:02.143 に答える
0

ASP.NET AJAX を使用してこれを実装する場合は、UpdatePanel とタイマー コントロールを使用できます。チュートリアル: 一定の間隔で UpdatePanel コントロールを更新する方法、それ以外の場合は jQuery Ajax を使用できます。

于 2013-01-07T10:51:40.543 に答える
0

それに応じてコードを更新します。

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);

それが役に立てば幸い :)

于 2013-01-07T10:13:33.600 に答える
-1

Page.IsPostBackプロパティを使用してみてください

于 2013-01-07T06:28:23.590 に答える