Kentico全局事件(ObjectEvents)导致循环



我使用ObjectEvents根据用户填写的字段向当前用户提供ActivityPoints。现在举个例子,如果用户注册并填写FirstName,我会给用户打10分。问题是我正在处理ObjectEvents.Update.之后,我在里面更新userSettings。这会导致无限循环,应用程序停止工作。周围有工作吗?

这是代码块:

var className = e.Object.TypeInfo.ObjectClassName;
DataClassInfo dci = DataClassInfoProvider.GetDataClass(className);
if (dci != null)
{
var fi = new FormInfo(dci.ClassFormDefinition);
if (fi != null)
{
var stopProccess = true;
var fields = new List<FormFieldInfo>();
foreach (var changedColumn in e.Object.ChangedColumns())
{
var field = fi.GetFormField(changedColumn);
var activityPointMacro = ValidationHelper.GetString(field.Settings["ActivityPointMacro"], "");
if (!string.IsNullOrEmpty(activityPointMacro))
{
fields.Add(field);
stopProccess = false;
}
}
if (!stopProccess)
{
var contextResolver = CMSContext.CurrentResolver.CreateContextChild();
foreach (FormCategoryInfo info in fi.ItemsList.OfType<FormCategoryInfo>())
{
contextResolver.SetNamedSourceData(info.CategoryName, info);
}
EditingFormControl data = new EditingFormControl();
foreach (FormFieldInfo info2 in fi.ItemsList.OfType<FormFieldInfo>())
{
contextResolver.SetNamedSourceData(info2.Name, data);
}
foreach (var field in fields)
{
{
var activityPointMacro = ValidationHelper.GetString(field.Settings["ActivityPointMacro"], "");
var activityPoint =
ValidationHelper.GetInteger(contextResolver.ResolveMacros(activityPointMacro), 0);
CMSContext.CurrentUser.UserSettings.UserActivityPoints += activityPoint;
CMSContext.CurrentUser.UserSettings.Update();
}
}
}
}
}

如果您只需要为用户字段打分,那么您只需要使用ObjectEvents.Update.在此之前,检查字段不为空并赋值。但我可以从代码中看到,您希望在宏表达式上有更复杂的构建。所以我有一些建议给你。

1) ObjectEvents.Update.Before而不是ObjectEvents.Update.After仍然是个好主意。理想情况下,您可以设置附加值,并且所有值都在一次更新中设置。

2) 只关注你需要的类名

3) 始终更喜欢Provider.SetInfo方法而不是信息。Update()。在用户设置的情况下,最好设置整个用户信息,因此UserInfoProvider.SetUserInfo.Provider方法可能会添加一些额外的重要逻辑。

4) 该代码似乎会随着用户的每次更新而增加分数

5) 如果您仍在运行循环,则需要以某种方式标记代码的某个部分不应再次执行。最好的方法是使用RequestStockHelper类-添加一个具有特定名称的bool值,如"PointsProcessed"。

最新更新