[英]Proper way to route to controllers in Umbraco ASP.NET / IApplicationEventHander vs ApplicationEventHandler vs RouteConfig.cs, RenderMvcController etc
[英]Umbraco ApplicationEventHandler Events not Firing?
我正在創建一個Umbraco網站,允許成員上傳照片。
我被要求創建一個僅列出已上傳照片的成員的頁面。 照片存儲為媒體,並具有關聯的“成員選擇器”屬性。 我試圖根據此字段制定一種獲取成員列表的方法,但是隨着網站的發展,我想出的一切似乎效率很低。
我決定在該成員上創建一個名為“ Number of Photos”的附加屬性。 當他們上傳照片時,數字會增加。 直到我們收到開始發送垃圾郵件的垃圾郵件發送者,它才有效。 在“媒體”部分中刪除照片后,該照片不會自動減少該成員的“照片數量”。 輸入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目錄中。
如前所述,請使用MediaEvents。 以下內容摘自Umbraco網站。
using Umbraco.Core; using Umbraco.Core.Events; using Umbraco.Core.Models; using Umbraco.Core.Services; namespace My.Namespace { public class MyEventHandler : ApplicationEventHandler { public MyEventHandler() { MediaService.Saved += MediaServiceSaved; } void MediaServiceSaved(IMediaService sender, SaveEventArgs e) { foreach (var mediaItem in e.SavedEntities) { // Do whatever you want with each entity } } } }
更新:如果您使用的是Umbraco的較新版本(例如,大約v7.3.0),則應使用:
MediaService.Saved += MediaServiceSaved
您也可以使用此:
public class UmbracoActionsHandler : IApplicationStartupHandler
{
public UmbracoActionsHandler()
{
Media.AfterMoveToTrash += Media_AfterMoveToTrash;
}
void Media_AfterMoveToTrash(Media sender, umbraco.cms.businesslogic.MoveToTrashEventArgs e)
{
......
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.