0

多くのUserControlが含まれているページ(フォーム)があり、すべてを保存するための1つのボタンを使用しようとしています。UserControlsは実際にはネストされているため、すべてを1つのイベントにラップしたり、単一のイベントで保存イベントのカスケードをトリガーしたりするのではなく、各UCにそれ自体を保存する必要があることを通知したいと思いました。

私の計画は静的クラスを使用することでした(コードのこの回答の小道具):

public static class RequestScopedFormData
{
    private const string save_key = "request_form_is_saving";

    public static bool FormIsSaving
    {
        get
        {
            object o = HttpContext.Current.Items[save_key];
            return Convert.ToBoolean(o);
        }
        set
        {
            HttpContext.Current.Items[save_key] = value;
        }
    }
}

理想的には、MasterPageのボタンでRequestScopedFormData.FormIsSaving = trueに設定し、.NETがページとそのUserControlsを構築するときに、自分で保存を実行することを認識します。

私が抱えている問題は、ページのライフサイクルの早い段階でUserControlsを保存するためのイベントを発生させることができないことです。保存コードをPreRenderイベントに移動し、保存ImageButtonを(MasterPageではなく)ページ自体に移動しても、UC保存チェックの前にFormIsSavingをtrueに設定できません。

これは次のように発生します。

  • ページPage_Load
  • MasterPage Page_Load
  • UC Page_LoadsとPreRenders(これらは混合されており、他をロードする前に一部をプリレンダリングします)
  • MasterPage SaveButton_Clickイベント(これはクラス変数を設定する場所です)
  • MasterPage PreRender
  • ページPreRender

そのため、残念ながら、SaveButton_ClickメソッドはUCがロードされた後に発生するため、UCが保存されることはありません。

4

3 に答える 3

3

@Page ディレクティブを変更して Trace="true" を含めます。これにより、呼び出されているものに関する完全な診断が得られ、必要なライフサイクルの部分に最適なメソッドを特定できるようになります。

于 2009-03-31T13:44:02.217 に答える
1

保存ボタンによってポストバックが発生したかどうかを確認することもできます。

Request.Form["__EVENTTARGET"].Contains({YourSaveButton}.UniqueID)

フォーム変数は、ページ ライフ サイクルの早い段階で使用できます。

于 2009-03-31T14:46:40.210 に答える
0

コントロールはすべて同じインターフェイスから派生していますか? それとも、それらに共通のインターフェイスを追加できますか?

次に、保存ボタン メソッドで、ページ上のすべてのコントロールを反復処理し、インターフェイスに一致する項目について、Save メソッドを呼び出します。

例えば

foreach (Control cntrl in Page.Controls)
{
  if (cntrl is IMySavableControl)
  {
     cntrl.Save();
  }
}
于 2009-03-31T14:20:34.483 に答える