65.9K
CodeProject 正在变化。 阅读更多。
Home

DotnetNuke 模块间通信

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2019年11月14日

CPOL

2分钟阅读

viewsIcon

3512

引言

在这里,我们将检查如何在 Dnn 中实现模块间通信。 使用此功能,我们可以在同一页面中将数据从一个模块传递到另一个模块。

背景

在 DNN 中,假设我们的页面包含 2 个不同的模块,一个模块带有下拉列表,另一个模块带有 GridView,我们需要根据下拉列表选定的值来绑定 GridView。 在这种情况下,我们需要从一个模块向另一个模块传递数据,并且我们可以通过使用 DNN 中的模块间通信功能来实现这一点。

使用代码

为了实现模块之间的通信,我们需要实现 IModuleCommunicatorIModuleListener 接口。 实现 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; 
}
    }
}

我们也可以将一个模块同时作为监听者和发送者,在这种情况下,我们需要实现这两个接口。 此外,我们可以将一个发送者模块作为另一个模块的监听者模块,并且我们可以为发送者模块创建多个监听者模块。

© . All rights reserved.