【问题标题】:Umbraco 7, How to change a custom property in MemberService.SavedUmbraco 7,如何更改 MemberService.Saved 中的自定义属性
【发布时间】:2018-08-30 08:40:30
【问题描述】:

一旦 Is Approved 标志首次设置为 true,我正在努力更改成员属性中的简单真/假标志。我可以更改属性,但未保存/提交该值。我已经尝试过 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


    【解决方案1】:

    也许尝试这样做?

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

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

    【讨论】:

    • 感谢您的回答,这正是我第一次尝试时的做法。我刚刚又试了一次,仍然没有工作。我想知道某处是否有某种安全设置阻止我这样做。
    【解决方案2】:

    这在我看来是某种错误,经过多次调试,我发现了以下内容:

    • 即使在保存时将 raise events 标志设置为 false,它仍然会再次通过该方法返回。
    • 在第二次通过时,您必须再次设置要更改的属性的值,即使它应该已经保存/提交。我不需要再次保存。 我认为这是一个错误
    • 由用户属性的 was dirty 标志更改的原始标志在第二次通过时不再设置。因此,最初对此的检查是停止再次设置我要更改的属性。
    • 我必须进行脏检查,以便在第二次通过时我不再发送电子邮件。
    • 请注意,即使使用 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);
                    }
                }
            }
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多