【问题标题】:Umbraco ApplicationEventHandler Events not Firing?Umbraco ApplicationEventHandler 事件未触发?
【发布时间】:2014-03-07 17:31:41
【问题描述】:

我正在创建一个允许会员上传照片的 Umbraco 网站。

我被要求创建一个仅列出已上传照片的成员的页面。照片存储为媒体并具有关联的成员选取器属性。我试图制定一种基于该字段获取成员列表的方法,但是随着站点的增长,我能想到的一切似乎都变得非常低效。

我决定在成员上创建一个名为“照片数量”的附加属性。当他们上传照片时,数字会增加。在我们得到一个开始上传垃圾的垃圾邮件发送者之前,它工作得很好。当照片在媒体部分被删除时,它不会自动减少成员的“照片数量”。输入 Umbraco 的ApplicationEventHandler:

using System.Web;
using umbraco.cms.businesslogic;
using umbraco.cms.businesslogic.media;
using umbraco.cms.businesslogic.member;
using Umbraco.Core;

namespace Umbraco.Extensions.EventHandlers
{
    public class RegisterEvents : ApplicationEventHandler
    {
        protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
        {
            Media.AfterMoveToTrash += Media_AfterMoveToTrash;

        }

        private void Media_AfterMoveToTrash(Media sender, MoveToTrashEventArgs e)
        {
            // Reset photo count for user
            if (sender.getProperty("member") != null)
            { 
                int memberId = int.Parse(sender.getProperty("member").Value.ToString());
                var member = new Member(memberId);
                int numPhotos = 0;
                int.TryParse(member.getProperty("numberOfPhotos").Value.ToString(), out numPhotos);
                if (numPhotos > 0)
                    numPhotos--;
                member.getProperty("numberOfPhotos").Value = numPhotos;
                member.Save();
            }
        }
    }
}

ApplicationStarted 正确触发。我遇到的问题是 Media.AfterMoveToTrash 事件永远不会触发。我也试过Media.AfterDelete,但无济于事。

我不确定它是否有所作为,但我将 Umbraco 作为一个网站而不是 MVC 项目运行。所有自定义代码(表面控制器、模型和此事件处理程序)都在 App_Code 目录中。

【问题讨论】:

    标签: c# event-handling content-management-system umbraco


    【解决方案1】:

    如前所述,使用 MediaEvents。以下内容来自 Umbraco 网站。

    使用 Umbraco.Core; 使用 Umbraco.Core.Events; 使用 Umbraco.Core.Models; 使用 Umbraco.Core.Services; 命名空间 My.Namespace { 公共类 MyEventHandler : ApplicationEventHandler { 公共 MyEventHandler() { MediaService.Saved += MediaServiceSaved; } void MediaServiceSaved(IMediaService 发送者, SaveEventArgs e) { foreach(e.SavedEntities 中的 var mediaItem) { // 对每个实体做任何你想做的事 } } } }

    更新:如果您使用的是较新版本的 Umbraco(例如大约 v7.3.0),您应该使用:

    MediaService.Saved += MediaServiceSaved

    【讨论】:

    • Umbraco 7 的 MediaService 事件列表在这里:our.umbraco.org/documentation/Reference/Events/… - 注意:大多数(如果不是全部)*Service 事件可以引用多个实体,例如批处理操作。
    • 我已经成功使用了 MediaService.Saving。现在我尝试使用 MediaService.Deleted/MediaService.Deleting 因为我也想从磁盘中删除文件。但是这些事件都没有触发。有人知道为什么吗?
    【解决方案2】:

    你也可以使用这个:

    public class UmbracoActionsHandler : IApplicationStartupHandler
        {
            public UmbracoActionsHandler()
            {
                Media.AfterMoveToTrash += Media_AfterMoveToTrash;
            }
    
            void Media_AfterMoveToTrash(Media sender, umbraco.cms.businesslogic.MoveToTrashEventArgs e)
            {
                ......
            }
        }
    

    【讨论】:

    • IApplicationStartupHandler 现已过时。相反,请使用 IApplicationEventHandler 或 ApplicationEventHandler。
    • 事件应该在较新的 MediaService 上订阅,而不是在旧的 Media 类上。
    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 2019-01-31
    • 2013-04-09
    • 2015-07-25
    • 2017-06-25
    • 2012-02-21
    • 2018-09-13
    • 2017-11-20
    相关资源
    最近更新 更多