0

我正在使用 ObjectEvents 根据用户填写的字段向当前用户提供 ActivityPoints。现在例如,如果用户注册并填写名字,我会给用户 10 分。问题是我正在处理 ObjectEvents.Update.After 并且在其中我正在更新 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();
                        }
                    }
                }

            }
        }
4

1 回答 1

0

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

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

2)只看你需要的类名

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

4)代码似乎会在每次更新用户时添加积分

5)如果你仍然陷入循环,你需要以某种方式标记,某些部分代码不应该再次执行。最好的方法是使用 RequestStockHelper 类 - 添加一个具有特定名称的布尔值,如“PointsProcessed”。

于 2013-12-31T08:50:59.467 回答