2

私はコード Page_Load と btnGonder_Click を持っています。btnGonder をクリックすると、いくつかのデータをデータベースに記録します。そして、page_load 内のコードを datalist に取得して表示します。問題は、ページを更新するたびに btn_Gonder_Click を実行することです。イベントと同じデータをデータベースに記録します。私のコードは以下の通りです。

 protected void Page_Load(object sender, EventArgs e)
{
 if (!IsPostBack)
{
        Cevap cevaplar = new Cevap();
        int soru_id = Convert.ToInt32(Request.QueryString["Soru_Id"]);
        cevaplar.soru_id = soru_id;
        DataTable dtcvp = new DataTable();
        dtcvp = cevaplar.Cevaplarive_CevapVerenleri_Getir();
        datalistcevaplar.DataSource = dtcvp;
        datalistcevaplar.DataBind();
}
}

 protected void btnGonder_Click(object sender, EventArgs e)
{
        Users kullanicim = new Users();
        HttpCookie bilgiler = Request.Cookies["Kullanicicookie"];
        kullanicim.mail = bilgiler["mail"];
        int donenkullaniciid = kullanicim.Kullanici_Id_Donder();
        cevaplar.cvpveren_id = donenkullaniciid;
        Sorular sorular = new Sorular();
        sorular.Cevap_Sayisi_Artir(soru_id);
        bool durum = cevaplar.Cevap_Ekle();
        if (durum)
        {
            lblDurum.Text = "Cevabınız Eklenmiştir";
        }
        else
        {
            lblDurum.Text = "Cevabınız Eklenmemiştir";
        }
        DataTable dtcvp = new DataTable();
        dtcvp = cevaplar.Cevaplarive_CevapVerenleri_Getir();
        datalistcevaplar.DataSource = dtcvp;
        datalistcevaplar.DataBind();
}
4

5 に答える 5

1

ページの更新は、前のポストバックの原因となった同じイベントを再起動するため、ボタンをクリックした後にページを更新すると、ボタンのクリック イベントが発生します。複数のソリューションを使用することを避けるために。ここを参照

于 2013-08-27T11:42:47.203 に答える
0

基本的に、それがページの更新なのか実際のボタンのクリックなのかを確認するための回避策が必要です。以下のようにできます: ここでのキーはViewState["IsPageRefresh"]&Session["IsPageRefresh"]です。これを機能させるには、ページで ViewState を有効にする必要があることに注意してください。ViewState が有効になっていない場合は、隠しフィールドを使用できます。

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Session["IsPageRefresh"] = Server.UrlDecode(System.DateTime.Now.ToString());
}
}

protected void Page_PreRender(object sender, EventArgs e)
{
ViewState["IsPageRefresh"] = Session["IsPageRefresh"];
}
protected void btnPost_Click(object sender, EventArgs e)
{
if (Session["IsPageRefresh"].ToString() == ViewState["IsPageRefresh"].ToString())
{
//Put your database INSERT code here
Session["IsPageRefresh"] = Server.UrlDecode(System.DateTime.Now.ToString());
}
}

1 つの単純なトリックですが、標準的な方法ではないかもしれませんが、 私も同意します: サーバー側でボタンを無効にしないでください。ページの読み込みが完了すると、ボタンは通常どおり機能します。

<head runat="server">
    <title></title>
    <script type="text/javascript">
        function checkButton() {
            var btn = document.getElementById("btnGonder");
            btn.disabled = true;
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Button ID="btnGonder" runat="server" onclick="btnGonder_Click" 
         OnClientClick="checkButton();" />
    </div>
    </form>
</body>
于 2013-08-27T13:02:05.960 に答える
0

更新時にページを再送信したくない場合は、データを直接バインドするのではなく、btnGonder_Click から同じページにリダイレクトする必要があります。これは、Asp.net アプリケーションの基本的な問題です。

Response.Redirect を実行し、ページの名前を渡します。

于 2013-08-27T11:46:14.507 に答える
0

ポストバックの原因となったボタンを既にクリックしている場合。次に F5 キーを押すと、ブラウザーはボタンをもう一度クリックすることを意味する RESEND を要求します。これは通常のブラウザの動作です

于 2013-08-27T12:54:15.360 に答える