C# Umbraco 7,如何更改MemberService中的自定义属性。已保存

C# Umbraco 7,如何更改MemberService中的自定义属性。已保存,c#,.net,umbraco,umbraco7,C#,.net,Umbraco,Umbraco7,我正在努力更改成员属性中的简单true/false标志,一旦Is Approved标志第一次设置为true。我可以更改属性,但未保存/提交该值。我已尝试MemberService.Saved和MemberService.Saveing。我对翁布拉科很陌生,所以可能错过了一些明显的东西 protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext ap

我正在努力更改成员属性中的简单true/false标志,一旦Is Approved标志第一次设置为true。我可以更改属性,但未保存/提交该值。我已尝试MemberService.Saved和MemberService.Saveing。我对翁布拉科很陌生,所以可能错过了一些明显的东西

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);
                } 
            }
        }
    }
}
protected override void应用程序已启动(umbraco应用程序基础umbraco应用程序,ApplicationContext ApplicationContext)
{
MemberService.Saved+=MemberService\u Saved;
}
已保存无效成员服务(IMemberService发送方,Umbraco.Core.Events.SaveEventArgs e)
{ 
foreach(e.SavedEntities中的var成员)
{
如果(!member.IsNewEntity())
{
var dirtyProperties=member.Properties.Where(x=>x.WasDirty()).Select(p=>p.Alias);
if(dirtyProperty.Contains(“umbracoMemberApproved”))
{
if(member.IsApproved&!member.GetValue(“approvalEmailSent”))
{
//向客户发送电子邮件
//新建SmtpClient()。发送(邮件);
var prop=member.Properties[“approvalEmailSent”];
属性值=真;
var propValue=member.GetValue(“approvalEmailSent”);
//已验证propValue现在为true
发送人。保存(成员);
} 
}
}
}
}
奇怪的是,我可以找到另一个成员,对属性进行更改并将其保存好,而不是在e.SavedEntities中发送的成员


TIA

也许可以试着这样做

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

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

在我看来,这似乎是某种错误,经过多次调试后,我发现了以下问题:

  • 即使在保存时将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);
                }
            }
        }
    }
}
protected override void应用程序已启动(umbraco应用程序基础umbraco应用程序,ApplicationContext ApplicationContext)
{
MemberService.Saved+=MemberService\u Saved;
}
已保存无效成员服务(IMemberService发送方,Umbraco.Core.Events.SaveEventArgs e)
{
foreach(e.SavedEntities中的var成员)
{
如果(!member.IsNewEntity())
{
if(member.IsApproved&!member.GetValue(“approvalEmailSent”))
{
SetValue(“approvalEmailSent”,true);
var dirtyProperties=member.Properties.Where(x=>x.WasDirty()).Select(p=>p.Alias);
if(dirtyProperty.Contains(“umbracoMemberApproved”))
{
//电子邮件客户
//新建SmtpClient()。发送(邮件);
发件人。保存(成员,false);
}
}
}
}
}

谢谢你的回答,这正是我第一次尝试时的做法。我只是又试了一次,但还是不起作用。我想知道是否有某种安全设置阻止我这么做。听起来确实有点奇怪!如果你认为你发现了一个bug,考虑在这里报告: