0

使ってます:

Response.Redirect(Request.RawUrl);

私のウェブページにポストバックを強制します。ただし、コード内の実行パスは、ページが初めて読み込まれた場合と同じです。通常のポストバックを発生させるにはどうすればよいですか?

アドバイスをいただければ幸いです。

よろしく。

編集:

この投稿は多くの否定的な見方をしているようです。ポストバックを強制するためのGoogle検索の後、StockOverflowの投稿からこのメソッドを取得しました。したがって、反対派はおそらく私の代わりにその投稿で彼らの欲求不満を取り除くべきです。

私の質問に関する誤解のいくつかを解決するには:

メソッド本体にロジックを含むイベントButton_Clickがあります-明らかに。ただし、コードの実行フローは次のようになります。

Button_Click-> Page_Load(IsPostBack == true)->Button_Clickbody->実行が終了します。

したがって、私の問題は、Button_Clickの本体のコードが実行される前にポストバックが実行されるため、Button_Clickの本体のロジックがページに表示されないことです。

編集:

イベントは次のとおりです。

protected void RedoEdits_Click(Object sender, EventArgs e)
{
    // Goes to Page_Load here with IsPostBack == true
    string trendsFileLocation = currDir + "\\" + reportDir + "\\" + trendsFile;
    string messagesFileLocation = currDir + "\\" + reportDir + "\\" + messagesFile;
    if (File.Exists(trendsFileLocation))
    {
        File.Delete(trendsFileLocation);
    }
    if (File.Exists(messagesFileLocation))
    {
        File.Delete(messagesFileLocation);
    }
    trendsXML.Clear();
    editMode = "redo";
}

IsPostBackのコードスニペット==true:

if (editMode.Equals("redo"))
{
    editMode = "";
    ViewReport_Click(null, null);
}

ポストバックが最初に発生するため、コードスニペットは実行されません。editMode!= redoのためにスニペットをスキップし、最後にeditMode == redoを設定するRedoEdits_Clickの本体で終了しますが、ポストバックがすでに発生しているため、ViewReport_Clickに到達しません。

そしてところで、editModeはセッション変数なので、それは持続します。

4

4 に答える 4

2

これは、リダイレクトによってページが初めて読み込まれるかのように読み込まれるためです。まったく投稿していません。これはボタンクリックのようなイベントハンドラーにある可能性がありますが、そのポストバックイベントハンドラーでリダイレクトすると、同じインスタンスのポストバックにはなくなり、ページを最初からリロードします。

private void MyButton_Click(Object sender, EventArgs e)
{
   lblStatus.Text = "Button Clicked!";  // still within a postback
   Response.Redirect(Request.RawUrl);  // now leaving the postback.  At this point, exexution stops and the page is loaded from scratch, as if we're not in a postback.

   lblStatus.Text = "Done posting back";  // This code will never execute.,  Response.Redirect throws a System.ThreadAbortException, and by default, code execution stops once Response.Redirect happens.

}

ページを最初からロードせずに真のポストバックをトリガーする場合は、画面にボタンまたはコントロールを配置し、それを使用して実際のポストバックをトリガーします。Response.Redirect()は呼び出さないでください。


以下のコメントのために追加されました:

ASP.NETページのライフサイクルをよく理解してください。ポストバック内で発生したくないことがPage_Loadで発生している場合は、それらを次のように囲む必要があります。

if(!Page.IsPostback)
{
  // stuff that should only happen on initial load here.
}

または、別のイベントでそれらのことを行うことを検討してください。たとえば、オンザフライでコントロールを作成する場合は、ViewStateが適用される前に行われるため、Page_Initで作成する必要があります。このようにすると、各ポストバックのPage_Initにコントロールが作成され、Viewstateから値が適用され、Page_Loadに到達して操作できるようになります。

于 2012-07-04T16:17:23.957 に答える
1

コードビハインドからポストバックを強制することはできません。どのようにそれをしますか?たとえば、ボタンをクリックするとポストバックが発生します。コードビハインドからそれを強制することが可能であったとしても(確かに方法はあります)、それによって何を達成しますか?必要なメソッドを呼び出すだけで、このような愚かなことはしないでください。

ポストバック=同じページにデータ/リクエストをポストバックします。リダイレクトは明らかに機能しません。

OP編集に基づく編集:

ワークフローを再考する必要があるので、次のようにします。

protected void RedoEdits_Click(Object sender, EventArgs e)
{
    // Goes to Page_Load here with IsPostBack == true
    string trendsFileLocation = currDir + "\\" + reportDir + "\\" + trendsFile;
    string messagesFileLocation = currDir + "\\" + reportDir + "\\" + messagesFile;
    if (File.Exists(trendsFileLocation))
    {
        File.Delete(trendsFileLocation);
    }
    if (File.Exists(messagesFileLocation))
    {
        File.Delete(messagesFileLocation);
    }
    trendsXML.Clear();

    ViewReport_Click(null, null);
}

ポストバックをエミュレートしようとするのは本当に良い考えではありません。

または、さらに良いアプローチ-新しいイベントを定義します。たとえば、EditModeActive(または任意の名前)を定義します。これは、editMode="redo"を割り当てるたびに起動します。次に、このイベントに登録して、好きなことをしてください。

于 2012-07-04T16:19:00.693 に答える
0

Response.Redirect()は、単純なGET要求をサーバーに送信するだけなので、ポストバックは発生しません。

于 2012-07-04T16:17:21.413 に答える
0

元の編集されていないHTMLを復元するには、ページを再読み込みする必要がありました。テーブルを編集するプロセスにより、一部のInnerHTMLが置き換えられ、編集をやり直すために最初からやり直す必要がありました。そのため、IsPostBack!= trueのコードで編集をやり直すために必要なロジックを移動し、Response.Redirect(Request.RawUrl)のままにしました。チャームのように機能します。

于 2012-07-05T15:25:36.747 に答える