1

我正在尝试为我正在处理的项目实施 MVP 模式(使用 webforms),但是我陷入了事件之后该怎么做的困境,特别是源自 gridview 的事件。目前,视图实现了一个接口,以便演示者可以调用视图上的方法。

我的gridview 包含了本质上是一些缩减的员工对象(尽管它不知道这一点),每个对象都有一个我已经必须隐藏在网格中的ID。

当在网格行上按下某些按钮时,可能会发生不同的事件(例如,删除、添加到作业等)。演示者需要访问员工 ID 才能执行功能(这可能会触发具有所述 ID 的服务层命令)。我试图让视图保持被动,但我认为在这个例子中这是不可能的。

在我看来,只有少数几种方法可以做到这一点。

  1. 在gridrow select上,在View的状态(不是gridrow id)中填充一个“选定的ID字段”,并触发通知演示者(事件或演示者调用)。演示者随后将访问此字段。选择事件需要从 gridview 推断 ID。

  2. 将 Id 直接传递给演示者,通过演示者通知上的参数(或事件参数,如果使用事件通知演示者)。选择事件需要从 gridview 推断 ID。

如果这是一个下拉列表,那将很容易,因为您可以只使用 GetSelectedValue,并在此周围有一个包装器方法(实现视图接口方法)。

希望你能帮忙。

谢谢。

4

1 回答 1

1

好的,最后我不得不为 UI 指定一点逻辑,并做了以下事情:

对于我希望由网格(或类似的东西)填充的任何类型的复杂列表对象,我正在通过接口传递 DTO 版本。
例如:

interface IPersonView {

SetPersonList(List<PersonDTO> personList);

event Action PersonDeleteClicked;

PersonDTO GetSelectedPerson()

void HidePersonId() }

  1. UI 接受它并用它填充网格。

  2. 如果演示者愿意,可以使用一些方法来隐藏列(例如 HideId 列)。

  3. 在触发 GridView 按钮事件时,我的 UI 检索选定的行对象,并将其转换为我的列表 PersonDTO,并将选定的 ID 存储在它自己的状态中。

  4. 然后我触发 PersonDeleteClicked 事件。

  5. 监听此事件的演示者现在调用接口方法:

    PersonDTO GetSelectedPerson()

  6. UI 通过使用保存的 PersonSelectedID 获取 PersonDTO 进行响应

于 2012-08-29T16:09:15.140 回答