私のページには、イベントをトリガーしてtxtファイルに記録するこのボタンがあります。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に設定されません。何が起こっている?
ただ、明確に...何が 'Page_Load'自体でログを持っている場合は?あなたはviewstatesを利用可能にしています... –
@SujeetSinha私はあなたが言っていることに本当に従っていません。私は 'Page_Load'の中で' writeToLogFile'を、そしてクリックのためにボタンイベントで 'writeToLogFile'を呼び出します。あなたは 'Page_Load'だけからログを取るべきですか? – Skillzore
ボタンをクリックすると、Page_Loadが最初に起動され、ボタンイベントの後にのみ発生します。したがって、ボタンイベントで設定しているViewStateが遅すぎます。これは動作しません。おそらく、ログをポストバックではなく、必要なときに呼び出すログメソッドへの別の呼び出しとして行うようにロジックを変更してください。 – Esko