Umbraco 7,如何在MemberService.Saved中更改自定义属性

问题描述 投票:1回答:2

一旦Is Approved标志首次设置为true,我正在努力改变成员属性中的简单true / false标志。我可以更改属性,但不保存/提交值。我已尝试过MemberService.Saved和MemberService.Saving。我对Umbraco很新,所以可能错过了一些明显的东西。

protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
    MemberService.Saved += MemberService_Saved;
}

void MemberService_Saved(IMemberService sender, Umbraco.Core.Events.SaveEventArgs<IMember> e)
{ 
    foreach (var member in e.SavedEntities)
    {
        if (!member.IsNewEntity())
        {
            var dirtyProperties = member.Properties.Where(x => x.WasDirty()).Select(p => p.Alias);
            if (dirtyProperties.Contains("umbracoMemberApproved"))
            {
                if (member.IsApproved && !member.GetValue<bool>("approvalEmailSent"))
                {
                    //Send Email to Customer
                    //new SmtpClient().Send(mail);

                    var prop = member.Properties["approvalEmailSent"];
                    prop.Value = true;

                    var propValue = member.GetValue<bool>("approvalEmailSent");
                    //Have verified propValue is now true

                    sender.Save(member);
                } 
            }
        }
    }
}

奇怪的是,我可以找到另一个成员,让属性更改并保存好,而不是通过e.SavedEntities发送的成员。

TIA

c# .net umbraco umbraco7
2个回答
3
投票

也许尝试这样做?

member.SetValue("approvalEmailSent", true);
sender.Save(member, false);

在MemberService.Saved中,告诉.Save方法不要引发任何进一步的事件,只是为了确保不会发生无限循环。


0
投票

这在我看来是某种bug,经过大量调试我发现了以下内容:

  • 即使在保存时将raise events标志设置为false,它仍然会再次通过该方法返回。
  • 在第二次传递时,您必须再次设置要更改的属性的值,即使它已应该已保存/已提交。我不需要再次保存。我相信这是一个错误
  • 原来由用户属性更改的脏标志不再设置第二次通过。因此,对此的原始检查是停止我想要更改再次设置的属性。
  • 我不得不进行脏检查,以便在第二次通过时我没有再发送电子邮件。
  • 作为注释,即使使用umbraco前端更改成员中不相关的内容也会导致我的方法运行两次。
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
    MemberService.Saved += MemberService_Saved;
}

void MemberService_Saved(IMemberService sender, Umbraco.Core.Events.SaveEventArgs<IMember> e)
{
    foreach (var member in e.SavedEntities)
    {
        if (!member.IsNewEntity())
        {
            if (member.IsApproved && !member.GetValue<bool>("approvalEmailSent"))
            {
                member.SetValue("approvalEmailSent", true);

                var dirtyProperties = member.Properties.Where(x => x.WasDirty()).Select(p => p.Alias);
                if (dirtyProperties.Contains("umbracoMemberApproved"))
                {
                    //Email Customer
                    //new SmtpClient().Send(mail);

                    sender.Save(member, false);
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.