Umbraco 7,如何在 MemberService.Saved 中更改自定义 属性
Umbraco 7, How to change a custom property in MemberService.Saved
一旦 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
也许尝试这样做?
member.SetValue("approvalEmailSent", true);
sender.Save(member, false);
在 MemberService.Saved 中时,告诉 .Save 方法不要引发任何进一步的事件,只是为了确保不会发生无限循环。
这对我来说似乎是某种错误,经过多次调试后我发现了以下内容:
- 即使在保存时将引发事件标志设置为 false,它仍然会再次通过该方法返回。
- 在第二次通过时,您必须再次设置要更改的 属性 的值,即使它应该已经保存/提交。我不需要再次保存。 我认为这是一个错误
- 原来被用户属性修改的was dirty flag第二次通过不再设置。所以最初的检查是停止 属性 I want to change being again set.
- 我必须进行脏检查,这样在第二次通过时我就不会再次发送电子邮件。
- 请注意,即使使用 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);
}
}
}
}
}
一旦 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
也许尝试这样做?
member.SetValue("approvalEmailSent", true);
sender.Save(member, false);
在 MemberService.Saved 中时,告诉 .Save 方法不要引发任何进一步的事件,只是为了确保不会发生无限循环。
这对我来说似乎是某种错误,经过多次调试后我发现了以下内容:
- 即使在保存时将引发事件标志设置为 false,它仍然会再次通过该方法返回。
- 在第二次通过时,您必须再次设置要更改的 属性 的值,即使它应该已经保存/提交。我不需要再次保存。 我认为这是一个错误
- 原来被用户属性修改的was dirty flag第二次通过不再设置。所以最初的检查是停止 属性 I want to change being again set.
- 我必须进行脏检查,这样在第二次通过时我就不会再次发送电子邮件。
- 请注意,即使使用 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);
}
}
}
}
}