DotnetNuke 模块间通信
引言
在这里,我们将检查如何在 Dnn 中实现模块间通信。 使用此功能,我们可以在同一页面中将数据从一个模块传递到另一个模块。
背景
在 DNN 中,假设我们的页面包含 2 个不同的模块,一个模块带有下拉列表,另一个模块带有 GridView,我们需要根据下拉列表选定的值来绑定 GridView。 在这种情况下,我们需要从一个模块向另一个模块传递数据,并且我们可以通过使用 DNN 中的模块间通信功能来实现这一点。
使用代码
为了实现模块之间的通信,我们需要实现 IModuleCommunicator
和 IModuleListener
接口。 实现 IModuleCommunicator
接口允许我们的模块向同一页面上监听 IMC 消息的所有模块发送消息。 实现 IModuleListener
接口允许该模块接收来自同一页面上模块发送的所有消息。 为了使用这些接口,我们需要在代码中包含以下命名空间。
using DotNetNuke.Entities.Modules.Communications;
发送数据的模块称为 **Communicator(发送者)**,接收数据的模块称为 **Listener(监听者)**。
为了创建一个发送者模块,我们需要实现 IModuleCommunicator
接口。 ModuleCommunicationEventArgs
类将用于与其他模块共享信息。 我们还需要创建一个 ModuleCommunicationEvenHandler
委托的实例,并将其命名为 ModuleCommunication
事件,如下所示。
public partial class CommunicatorTest : PortalModuleBase , IModuleCommunicator
{
public event ModuleCommunicationEventHandler ModuleCommunication;
private void Page_Load(object sender, System.EventArgs e)
{
try
{
if (!IsPostBack)
{
BindDropdown();
}
}
catch (Exception exc)
{
}
}
protected void ddlYear_SelectedIndexChanged(object sender, EventArgs e)
{
if (ModuleCommunication != null)
{
ModuleCommunicationEventArgs mcArgs = new ModuleCommunicationEventArgs(this.GetType().ToString(), ddlYear.SelectedValue, this.GetType().ToString(), "ListenerTest");
ModuleCommunication(this, mcArgs);
}
}
}
在这里,我们需要将下拉列表选定的值传递给监听者模块,我们需要创建 ModuleCommunicationEventArgs
类的一个对象,并将值传递给 ModuleCommunicationEventArgs
类的构造函数,并将该对象作为参数传递给事件处理程序。
为了接收来自发送者模块的信息,我们需要在监听者模块中实现 IModuleListener
接口,该接口需要实现 OnModuleCommunication
方法,如以下代码所示,我们可以访问该值,如以下代码所示。
public partial class ListenerTest : PortalModuleBase, IModuleListener
{
protected void Page_Load(object sender, EventArgs e) {
}
public void OnModuleCommunication(object sender, ModuleCommunicationEventArgs e)
{
if (e.Target == "ListenerTest")
{
string selectedYear = e.Value;
}
}
}
我们也可以将一个模块同时作为监听者和发送者,在这种情况下,我们需要实现这两个接口。 此外,我们可以将一个发送者模块作为另一个模块的监听者模块,并且我们可以为发送者模块创建多个监听者模块。