0

新しいページにリダイレクトする前に、親ページから保存メソッドを呼び出すユーザー コントロールがあります。

親の保存メソッドでエラーまたは例外がスローされた場合、それは無視されているように見え、子は引き続きリダイレクトします。例外をリッスンする方法はありますか、または何らかの方法でリダイレクトを防ぐ方法は、save メソッドが完全に実行されていないことです。

問題のユーザーコントロールコードは次のとおりです。

this.Page.GetType().InvokeMember(stepGuide.SaveMethod, System.Reflection.BindingFlags.InvokeMethod, null, this.Page, null);
AppPageMethods.RedirectToPage(button.CommandArgument);

回答に感謝しますが、これをできるだけモジュール化したいと思っていました...

現在、ユーザー コントロールは約 15 ページで使用されているため、マスター ページにユーザー コントロールを追加しました。これらのページは完全に単独で機能し、ユーザー コントロールは、初めてのユーザーのみが使用する追加レイヤー (ガイド付きツアー) として機能します。ユーザー コントロールは、クエリ文字列の引数によってのみ呼び出され、現在の親ページに関するすべての情報がデータベースの行から読み込まれます。

このコントロールは今後さらに多くのページに追加されるため、これにより柔軟性が向上すると思います。このユーザー コントロール機能を新しいページに追加するには、db に新しい行を追加し、親の保存メソッドが public であることを確認するだけです。

各親ページをほとんどまたはまったく変更せずに、ユーザーコントロールから親 ApplicationException を処理/リッスンする方法はありますか?

4

4 に答える 4

3

UserControl が親コントロール (またはページ) のメソッドを呼び出す "正しい" 方法は、ユーザー コントロールが、親コントロールがリッスンする (サブスクライブする) イベントを発生させることです。

これは、ユーザーコントロールがどのコントロールにも強く結び付けられないようにするためです。たとえば、別のページでコントロールを再利用する場合は、ユーザー コントロールにコードを追加して、どの「親」メソッドを呼び出すかを認識できるようにする必要があります。実装している方法論は、すぐに混乱する可能性があります。

追加の利点は、現在直面している問題が発生しないことです。エラーがスローされた場合は、「通常の」方法で処理できます。

于 2013-03-27T20:22:03.017 に答える
3

正しい方法は、イベントを子ページから親ページにバブルアップすることです。その逆はありません。

そのため、親ページはそのイベントを登録して利用するか (有用な場合)、完全に無視することができます。

このようなもの。

// Parent ASPX
<uc1:ChildControl runat="server" ID="cc1" OnSomeEvent="cc1_SomeEvent" />

// Parent
protected void cc1_SomeEvent(object sender, EventArgs e)
{
    // Handler event
}

// Child
public event EventHandler OnSomeEvent;

protected void ErrorOccurInControl()
{
     if (this.OnSomeEvent != null)
     {
          this.OnSomeEvent(this, new EventArgs());
     }
}

protected override void OnLoad(EventArgs e)
{
     ErrorOccurInControl();
}
于 2013-03-27T20:23:50.697 に答える
0

からブール値を返し、SaveMethod次のようなことをしますか?

try
{
    if(this.Page.GetType().InvokeMember(stepGuide.SaveMethod,
        System.Reflection.BindingFlags.InvokeMethod, null, this.Page, null))
    {
        AppPageMethods.RedirectToPage(button.CommandArgument);
    }
    else
    {
        // Do something else
    }
}
catch (Exception ex) // Better still, use specific exceptions
{
    // Handle exception
}

また、SaveMethod独自の例外を処理している場合は、呼び出し元のメソッドがそれを無視しているのはそのためです。この場合、ブロックraise;内で行う必要があります(または、実際に呼び出し元にバブルアップしたい例外を処理しないほうがよいでしょう)。catchSaveMethod

編集:ただし、イベントの発生について説明している他の回答は、確かにより良いアプローチです。

于 2013-03-27T20:19:53.670 に答える
0

親ページ(関数と呼ばれる)内で、例外が飲み込まれていないことを確認してください。これにより、呼び出し元からのエラーをキャッチして適切に処理できます。

try{
  this.Page.GetType().InvokeMember(stepGuide.SaveMethod, System.Reflection.BindingFlags.InvokeMethod, null, this.Page, null);
  AppPageMethods.RedirectToPage(button.CommandArgument);
}
catch(Exception e)
{
   //Do something else than redirect here
}

また、特定の例外である場合は、それらをキャッチして処理するよりも、一般的な例外に類似するのが理想的です。

于 2013-03-27T20:20:38.820 に答える