请参阅下面的更新,了解更简短的说明
我遇到基于事件的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界面事件。加载时,视图正在创建此演示者的具体版本,这在某种程度上会导致演示者填充所有视图字段。到现在为止还挺好。
问题是当通过btnSaveMeeting_Click引发MeetingSavedClicked事件时,不会触发演示者中相应的订阅方法。这可能是因为演示者不再在内存中,因为在回发后状态不会被维护。我不确定presenter事件中的订阅是否会导致它以某种方式留在内存中(我真的不太了解自定义事件),但似乎情况并非如此。
然后,唯一的选择是将演示者存储在视图状态或会话中吗?这是否意味着事件订阅仍然存在并执行?
道歉,如果这看起来很基本,但我对事件,MVP等有点新手。
UPDATE 也许我可以让这个更清楚一点:
我的webform实现了一个具有动作事件的界面。
webform创建一个自定义对象,该对象具有订阅此接口事件的方法。
在回发时,会在webform(后面的代码)上引发一个click事件,这反过来会引发已实现的接口事件。
现在,自定义对象不再位于webform的状态内存中,因为我们处于回发状态(并且自定义对象未存储在会话或视图状态中)。
我订阅的处理程序是否仍然在那里并且能够捕获这个引发的事件?或者他们在回发时被“处理”了?
感谢。
答案 0 :(得分:0)
回发中使用的页面对象是一个全新的页面对象。它绝不会连接到您的旧页面对象。要解决您的问题,您必须重新创建演示者,然后再次将事件连接起来。
从技术上讲,如果垃圾收集器尚未收集它们,那么旧的page-object和presenter-object以及它们之间的eventhandler可能仍然在内存中。但是没有对这些对象的引用,它们将/可能会在下一次GC运行中收集。