簡単な質問*
1 つ以上のネストされたマスター ページを介してトップ レベルのマスター ページでイベントを発生させる場合、ネストされたマスター ページでイベントをキャッチして再発生させる必要がありますか? そうでない場合、より良いアプローチは何ですか?
* これは、私が SO.SE で回答したいと思っている質問です。残りは、それを説明するための背景情報です。
詳細な質問と例
マスターページ ("TopLevel.master" と呼びます) のイベントは、ネストされたすべてのマスター ページ (1 つしかないと仮定して、"MidLevel.master" と呼びます) を通じて、ページ自体 (Page.aspx) に対して発生する必要があります。私がやっていること (以下) は正常に動作しますが、間違ったアプローチを使用しているのではないかと心配しており、将来のある時点で (たとえば、コードを保守するようになったとき) . また、いくつかの追加イベントが不要な場合に作成されるため、よりコストのかかるアプローチになる可能性があります。
ネストされた各マスター ページとページ自体には @MasterType 宣言があるため、マスター ページのパブリック プロパティ、メソッド、およびイベントはコード ビハインドを介して使用できます。
これまでのところ、次のようなものがあります (簡潔にするために簡略化しています)。
トップレベル.マスター:
' A public event available from this master page
Public Event MyEvent(sender As Object, e As EventArgs)
' A function that can be called via "Master.DoSomething" to initiate the process
Public Sub DoSomething(someArgs As Object)
Me._DoSomething(someArgs)
End Sub
' A local function that starts the process. SomeEventFiringObject is
' just an object that fires an event when the process is complete.
Private Sub _DoSomething(someArgs As Object)
_someEventFiringObject.DoSomething(someArgs)
End Sub
' A local function that handles the process-complete event fired by
' SomeEventFiringObject and fires my public masterpage event
Private Sub Me_HandleEvent(sender As Object, e As EventArgs) Handles _someEventFiringObject.HasDoneSomething
RaiseEvent MyEvent(sender, e)
End Sub
MidLevel.master:
' Handle the event from the masterpage.
Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init
AddHandler Master.MyEvent, AddressOf Master_MyEvent
End Sub
' A public event available from this master page
' NOTE: This is essentially the same event as in the TopLevel master page.
Public Event MyEvent(sender As Object, e As EventArgs)
' A function that can be called via "Master.DoSomething" to initiate the process
' NOTE: Just passing this up to the TopLevel master page.
Public Sub DoSomething(someArgs As Object)
Master.DoSomething(someArgs)
End Sub
' A local function that re-raises the event from this master page
' NOTE: Handler added on Page.Init.
Private Sub Master_MyEvent(sender As Object, e As EventArgs)
RaiseEvent MyEvent(sender, e)
End Sub
ページ.aspx:
' EDIT: This needs to be done on Page.Init as well.
Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init
AddHandler Master.MyEvent, AddressOf Master_MyEvent
End Sub
' Some process initiation (button click in this example could be anything)
' The master page does the deed and will eventually raise the MyEvent event.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Master.DoSomething(someArgs)
End Sub
' The page handles the master MyEvent event (which is actually from MidLevel.master)
Private Sub Master_MyEvent(sender As Object, e As EventArgs)
' Finally I can do something with this event
End Sub
質問:
MidLevel マスター ページで効果的にキャッチせずに TopLevel マスター ページで発生した MyEvent イベントにアクセスし、新しいイベントを作成してコピーして送信する方法が必要だと私には思えますが、できます。うまくいかないようです。これを行う方法はありますか?それとも、私が取ったアプローチは十分に有効ですか?
私の懸念は、MidLevel.master 内に実際には 2 層のマスター ページがあるため、多くのコピーされたコードといくつかのイベントが、イベントを渡す以外の理由で作成されているように見えることです。