簡単な説明については、以下のアップデートを参照してください。
イベント ベースの MVP アプローチに問題があります。私は次の設定をしています:
public class MeetingPresenter : IMeetingPresenter
{
IViewMeeting;
public MeetingPresenter(IViewMeeting view)
{
this.View = view;
PopulateViewData();
this.View.MeetingSavedClicked += OnMeetingSavedClicked;
}
public void PopulateViewData()
{
Imeeting meeting = service.GetMeeting();
view.SetMeetingDate(meeting.date);
}
private void OnMeetingSavedClicked()
{
service.SaveMeeting(view.GetMeeting());
}
}
public interface IViewMeeting
{
void SetMeetingDate(Datetime date);
IMeeting GetMeeting();
event Action MeetingSavedClicked;
}
表示: (vb で記述)
Partial Class MeetingPage
Inherits System.Web.UI.Page
Implements IViewMeeting
{
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Presenter = New MeetingPresenter(Me)
Else
End If
End Sub
Private _presenter As IMeetingPresenter
Public Property Presenter() As IMeetingPresenter
Get
Return _presenter
End Get
Set(ByVal value As IMeetingPresenter)
_presenter = value
End Set
End Property
Public Sub SetMeetingDate(ByVal date As Datetime) Implements IMeetingVisits.SetMeetingDate
lblMeetingDate.Text = date.Date.ToString()
End Sub
}
//Not implementing this fully - should get the idea
public Function GetMeeting as IMeeting Implements IMeetingVisits.GetMeeting
end function
Event MeetingSavedClicked As Action Implements IViewMeeting.MeetingSavedClicked
Public Sub btnSaveMeeting_Click(ByVal sender As Object, ByVal e As System.EventArgs)
RaiseEvent MeetingSavedClicked()
End Sub
- 続行する前に、ビューなどの依存関係を取り除くことができ、どのモデルもビュー固有である必要があることに気付きました。*
私が抱えている問題はイベントにあります。プレゼンターで View インターフェイス イベントをサブスクライブしています。ビューは、ロード時に、このプレゼンターの具体的なバージョンを作成しています。これにより、プレゼンターはすべてのビュー フィールドにデータを入力します。ここまでは順調ですね。
問題は、MeetingSavedClicked イベントが btnSaveMeeting_Click によって発生したときに、プレゼンターの対応するサブスクライブ メソッドが起動されないことです。ポストバック後に状態が維持されないため、プレゼンターがメモリに存在しなくなったためと考えられます。プレゼンターイベントのサブスクリプションが何らかの形でメモリに残るかどうかはわかりませんでしたが(カスタムイベントについてはよくわかりません)、そうではないようです.
その場合、プレゼンターをビューステートまたはセッションに保存する唯一のオプションはありますか? これは、イベント サブスクリプションが引き続き存在し、実行されることを意味しますか?
これが非常に基本的なように思われる場合は申し訳ありませんが、私はイベントや MVP などの初心者です。
更新おそらく、これをもう少し明確にすることができます:
私の Web フォームは、アクション イベントを持つインターフェイスを実装しています。
Web フォームは、このインターフェイス イベントにサブスクライブされたメソッドを持つカスタム オブジェクトを作成します。
ポストバック時に、Web フォーム (コード ビハインド) でクリック イベントが発生し、実装されたインターフェイス イベントが発生します。
これで、カスタム オブジェクトは Web フォームのステート メモリになくなりました。これは、ポストバックしているためです (カスタム オブジェクトはセッションまたはビューステートに保存されていません)。
サブスクライブしたハンドラーは引き続き存在し、この発生したイベントをキャッチできる必要がありますか? それとも、ポストバックの時までに「処分」されましたか?
ありがとう。