3

ここで何か重要なものが欠けているような気がします。

http://msdn.microsoft.com/en-us/magazine/cc300437.aspxと google のガイドに従ってみました が、まだ行っていないことがわかりません。

これを機能させるために書いた非常に基本的なコードがいくつかあります。

Default.aspx コード:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableSessionState="True" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Demo Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="myLabel" runat="server" Text="foo"></asp:Label>
        <asp:LinkButton ID="lnkClickButton" runat="server" OnClick="lnkClickButton_Click" CommandName="Clicky">Click Me</asp:LinkButton>
    </div>
    </form>
</body>
</html>

Default.aspx.cs コード:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Session["clickcount"] = 0;
        Cache["clickscount"] = 0;
    }
    protected void lnkClickButton_Click(object sender, EventArgs e)
    {
        Session["clickcount"] = (int)Session["clickcount"] + 1;
        Cache["clickscount"] = (int)Cache["clickscount"] + 1;

        Label myLabel = ((Label)this.FindControl("myLabel"));
        if (myLabel != null)
        {
            myLabel.Text = "Session: " + Session["clickcount"] + "; Cache: " + Cache["clickscount"] + ";";
        }
    }
}

セッション オブジェクトとキャッシュ オブジェクトの両方を使用して値をインクリメントしようとしましたが、役に立ちませんでした。私は毎回1を取得します。

NBこれは私の最初のasp.netプロジェクトであり、c#も初めてです。

4

4 に答える 4

6

Page_Loadポストバックと初期ロードのたびに実行されます。でポストバックを指定する必要はありませんPage_Load:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack){
       Session["clickcount"] = 0;
       Cache["clickscount"] = 0;
    }
}

さらに良いことに、値がまだない場合にのみ設定するように指定します。

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["clickcount"] == null){
       Session["clickcount"] = 0;
    }
}

明確にするために、まだ設定されていない場合にのみ値を設定する方が良い理由は、誰かがページに直接アクセスするたびに Page.IsPostBack が false になるためです。たとえば、ページhttp://example.com/Demo/Default.aspxがあり、上部にロゴがあり、それをここにロゴでラップすると、誰かがロゴをクリックするたびにセッションがリセットされますが、彼らは実際にページを離れませんでした。最後の投稿を再投稿せずにブラウザーで更新した場合にも発生します。

于 2012-05-28T10:08:56.727 に答える
4

MSDN で読む: Page.IsPostBack プロパティ - ページが初めてレンダリングされているか、ポストバックに応答して読み込まれているかを示す値を取得します。

クライアントのポストバックに応答してページがロードされている場合、プロパティの vlue はtrueです。それ以外の場合はfalse

!IsPostBackこのようなコード...以下のようにコードを入れる必要があり ます

protected void Page_Load(object sender, EventArgs e)     
{
     if(!IsPostBack)
    {
         Session["clickcount"] = 0;
         Cache["clickscount"] = 0;
    }
 } 

サーバーサイド コントロールは、自分自身をページングするためのポストバックを生成するため、各ポストバックで実行する必要のないコードを上記のように配置する必要があります

これにより、問題が簡単に解決されます...

これに加えて、このようなカウントの静的プロパティを作成できます

私の投稿を確認してください:サーバー側の状態維持変数のプログラミング実践

private int ClickCount
{
  get 
   {
     if (Session["clickcount"] == null)
     {         Session["clickcount"] = 0; return 0;      }
     else 
        return (int)Session["clickcount"] ; 
   }
   set
   {
      Session["clickcount"] = value;
   }
} 

最終的なコードよりも

protected void Page_Load(object sender, EventArgs e)     
{
         if(!IsPostBack)
        {
            ClickCount = 0; 
        }
}

protected void lnkClickButton_Click(object sender, EventArgs e)
{
              int val = ClickCount ;
              ClickCount  = val + 1; 
}
于 2012-05-28T10:09:39.460 に答える
1

書き込み:

Session["clickcount"] = 0;

Page_Load では、ユーザーがページに入るたびにカウンターがリセットされます。

私にはあなたがこのようなものが欲しいようです:

protected void lnkClickButton_Click(object sender, EventArgs e)
{
    if (Session["clickcount"] == null)
    {
            Session["clickcount"] = 1;
    }
    else
    {
           Session["clickscount"] = (int)Session["clickscount"] + 1;
    }

    Label myLabel = ((Label)this.FindControl("myLabel"));
    if (myLabel != null)
    {
        myLabel.Text = "Session: " + Session["clickcount"] + "; 
    }
}
于 2012-05-28T10:14:24.627 に答える
1

セッションをポストバックするたびに 1 を取得し、変数をキャッシュすると 0 になります。

protected void Page_Load(object sender, EventArgs e)
{
    Session["clickcount"] = 0;
    Cache["clickscount"] = 0;
}

また、ボタンのクリックは page_load の後に発生するため、IsPostback プロパティを使用する必要があります。

 protected void Page_Load(object sender, EventArgs e)     

{

 if(!IsPostBack)
{
     Session["clickcount"] = 0;
     Cache["clickscount"] = 0;
}

}

現在、これらの変数は、ページが読み込まれたときにのみ初期化されます。

次のリンクをたどってください。Asp.netのページライフについて説明しています。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

于 2012-05-28T10:51:50.530 に答える