2016-07-12 47 views
0

私のページには、イベントをトリガーしてt​​xtファイルに記録するこのボタンがあります。ViewStateの助けを借りてファイルにロギング

void ButtonClick(object sender, EventArgs e) 
    { 
     // Stop/start service 
     var button = (Button)sender; 
     string machine = button.CommandArgument; 
     string service; 

     /*Do stuff */ 

     if (buttonClicked) 
     { 
      writeToLogFile("User " + HttpContext.Current.User.Identity.Name + " pressed the " + button.CommandName + " button on server " + machine + " with the services " + checkedBoxes(machine) + " checked."); 
      ViewState["buttonClicked"] = buttonClicked; 
     } 
    } 

このボタンは、自分のページの状態を変更します。この状態は他のソースから変更することもできますので、私もそれを記録します。

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      prevStatus = new Dictionary<string, ServiceControllerStatus>(); 
      currStatus = new Dictionary<string, ServiceControllerStatus>(); 
      buttonClicked = false; 
      ViewState["buttonClicked"] = false; 
     } 
     else 
     { 
      prevStatus = (Dictionary<string, ServiceControllerStatus>)ViewState["prevStatus"]; 
      currStatus = (Dictionary<string, ServiceControllerStatus>)ViewState["currStatus"]; 
      buttonClicked = (bool)ViewState["buttonClicked"]; 
      if (!buttonClicked) 
      { 
       foreach (var item in currStatus) 
       { 
        ServiceControllerStatus oldStatus; 
        if (prevStatus.TryGetValue(item.Key, out oldStatus) && !(oldStatus == item.Value)) 
        { 
         string[] split = item.Key.Split('_'); 
         writeToLogFile("The service " + split[0] + " on server " + split[1] + " was changed to " + item.Value + " from another source."); 
        } 
       } 
      } 
      else 
      { 
       ViewState["buttonClicked"] = false; 
      } 

しかし、このログでは、ボタンをクリックしたときにログに記録されますが、これは不要です。したがって、ポストバックの間に状態変数buttonClickedを保持する必要があります。

ここでの問題は、ViewState変数をリセットする最後のケースです。それ以外はうまく動作します。しかし、私はこのリセットを持っていない場合、ボタンをクリックした後、buttonClickedが真のままであるので、別のロガーはロギングを停止します。しかし、リセットを実装した場合、ViewStateはPage_Loadの開始時にfalseに設定されるため、ボタンと他のロガーの2回のログが発生するため、すべての意味が失われます。私はなぜこの他のケースがifステートメントの前に起こっているのか理解しようとしている私の髪を引っ張ってきました。

Page_Loadを押した直後にデバッグしてボタンクリックイベントからステップすると、ViewStateはfalseに設定されます。 else case内の行をコメントアウトすると、デバッグをステップ実行している間はfalseに設定されません。何が起こっている?

+0

ただ、明確に...何が 'Page_Load'自体でログを持っている場合は?あなたはviewstatesを利用可能にしています... –

+0

@SujeetSinha私はあなたが言っていることに本当に従っていません。私は 'Page_Load'の中で' writeToLogFile'を、そしてクリックのためにボタンイベントで 'writeToLogFile'を呼び出します。あなたは 'Page_Load'だけからログを取るべきですか? – Skillzore

+0

ボタンをクリックすると、Page_Loadが最初に起動され、ボタンイベントの後にのみ発生します。したがって、ボタンイベントで設定しているViewStateが遅すぎます。これは動作しません。おそらく、ログをポストバックではなく、必要なときに呼び出すログメソッドへの別の呼び出しとして行うようにロジックを変更してください。 – Esko

答えて

0

ボタンをクリックするか、他のポストバックが発生すると、Page_Loadイベントは、実際のイベントがボタンなどにバインドされる前に実行されます。ページライフサイクルの詳細はhereをご覧ください。

です。問題は、設定しようとしているViewState値が遅すぎて、Page_Loadで評価できないということです。

解決策の1つは、ロギングロジックを別のメソッドに置き、必要に応じて呼び出すことです。

例:

public partial class _Default : Page 
    {  

     protected void Page_Load(object sender, EventArgs e) 
     { 
     } 

     private void Log() 
     {    
      if (ViewState["prevStatus"] != null && ViewState["currStatus"] != null) 
      { 
       prevStatus = (Dictionary<string, ServiceControllerStatus>)ViewState["prevStatus"]; 
       currStatus = (Dictionary<string, ServiceControllerStatus>)ViewState["currStatus"];     

       foreach (var item in currStatus) 
       { 
        ServiceControllerStatus oldStatus; 
        if (prevStatus.TryGetValue(item.Key, out oldStatus) && !(oldStatus == item.Value)) 
        { 
         string[] split = item.Key.Split('_'); 
         writeToLogFile("The service " + split[0] + " on server " + split[1] + " was changed to " + item.Value + " from another source."); 
        } 
       }     
      }   
     } 

     protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      // Do stuff 

      this.Log(); 
     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      // Stop/start service 
      var button = (Button)sender; 
      string machine = button.CommandArgument; 
      string service; 

      /*Do stuff */ 
      writeToLogFile("User " + HttpContext.Current.User.Identity.Name + " pressed the " + button.CommandName + " button on server " + machine + " with the services " + checkedBoxes(machine) + " checked."); 
     } 

    } 
+0

よろしくお願い致します! – Skillzore

関連する問題