Search code examples
c#dotnetnukeattachmentmessagingdnn9

DNN attach file to Notification


I am using DNN 9 and I want to send a notification with an attachment file, but seems that DNN doesn't allow to do that.

Is there is a way (or any workaround) to do that?

Here is the DNN code of the NotificationsController enter image description here

and here is my code that calls the DNN code

//...
Notification dnnNotification = new Notification
{
    NotificationTypeID = notification.NotificationTypeId,
    From = notification.From,
    Subject = notification.Subject,
    Body = notification.Body
};
NotificationsController.Instance.SendNotification(dnnNotification, portalId, dnnRoles, dnnUsers);

Solution

  • You cannot attach a file to a notification in DNN. BUT, you can add custom notification actions to a notification type. These actions result in links added under the notification (like the default "Dismiss" action to mark the notification as "read").

    In order to send a notification, you need to create a NotificationType to associate that to. The NotificationTypeAction are added to the type. So whenever you send a notification of a certain type, the actions go with it.

    You could create a NotificationTypeAction and name it "Download Attachment". When a user clicks the link, it will call a custom api service. That service could serve up the file.

    Here is some sample code in which I create a custom type with 1 custom action:

    public void AddNotificationType()
    {
        var actions = new List<NotificationTypeAction>();
        var deskModuleId = DesktopModuleController.GetDesktopModuleByFriendlyName(Constants.DESKTOPMODULE_FRIENDLYNAME).DesktopModuleID;
    
        var objNotificationType = new NotificationType
        {
            Name = Constants.NOTIFICATION_FILEDOWNLOAD,
            Description = "Get File Attachment",
            DesktopModuleId = deskModuleId
        };
    
        if (NotificationsController.Instance.GetNotificationType(objNotificationType.Name) == null)
        {
            var objAction = new NotificationTypeAction
            {
                NameResourceKey = "DownloadAttachment",
                DescriptionResourceKey = "DownloadAttachment_Desc",
                APICall = "DesktopModules/MyCustomModule/API/mynotification/downloadfile",
                Order = 1
            };
            actions.Add(objAction);
    
            NotificationsController.Instance.CreateNotificationType(objNotificationType);
            NotificationsController.Instance.SetNotificationTypeActions(actions, objNotificationType.NotificationTypeId);
        }
    }
    

    Then use code like the following to send the notification:

    public void SendNotification(UserInfo userToReceive)
    {
        // Get the notification type; if it doesn't exist, create it
        ModuleController mCtrl = new ModuleController();
        var itemAddedNType = NotificationsController.Instance.GetNotificationType(Constants.NOTIFICATION_FILEDOWNLOAD);
        if (itemAddedNType == null) 
        { 
            AddNotificationType();
            itemAddedNType = NotificationsController.Instance.GetNotificationType(Constants.NOTIFICATION_FILEDOWNLOAD);
        }
    
    
        if (itemAddedNType != null)
        {
            Notification msg = new Notification
            {
                NotificationTypeID = itemAddedNType.NotificationTypeId,
                Subject = "A file is ready to download.",
                Body = alertBody,
                ExpirationDate = DateTime.MaxValue,
                IncludeDismissAction = true,
            };
    
            List<UserInfo> sendUsers = new List<UserInfo>();
            sendUsers.Add(userToReceive);
    
            NotificationsController.Instance.SendNotification(msg, itemModule.PortalID, null, sendUsers);
        }
    }
    

    For a full tutorial on DNN Notifications, I highly recommend subscribing to DNNHero.com and watching this 3-part series which comes with sample code.

    https://www.dnnhero.com/Premium/Tutorial/ArticleID/265/DNN-Notifications-Introduction-Part-1-3