以编程方式创建时未保存 Sitecore 用户配置文件设置

Posted

技术标签:

【中文标题】以编程方式创建时未保存 Sitecore 用户配置文件设置【英文标题】:Sitecore User Profile Settings not saved when created programmatically 【发布时间】:2015-11-11 16:48:58 【问题描述】:

我正在 Sitecore 站点 (Sitecore 7.0 ) 上构建注册组件,在创建用户时,没有创建任何自定义配置文件或角色。日志中没有错误。创建的用户具有正确的用户名和域,但没有自定义配置文件并且缺少全名、电子邮件地址、角色和其他自定义字段。有没有人在实现这一目标时遇到过任何相关的困难?

注意如果这会有所不同,请使用电子邮件地址作为用户名。我已经更新了配置以允许这样做。我还在下面添加了一些日志记录,它们都输出了正确的信息。

以下是代码示例:

 try
        
            if (!User.Exists(userEntity.EmailAddress))
            
                var user = Membership.CreateUser(CreateUserName(userEntity), userEntity.Password,
                    userEntity.EmailAddress);

                User scUser = User.FromName(userEntity.EmailAddress, true);
                if (Role.Exists(Constants.Roles.ExampleRole) && !scUser.IsInRole(Constants.Roles.ExampleRole))
                
                    Roles.AddUserToRole(userEntity.EmailAddress, Constants.Roles.ExampleRole);
                

                if (scUser != null)
                
                    using (new Sitecore.SecurityModel.SecurityDisabler())
                    
                        scUser.Profile.FullName = userEntity.FirstName + " " + userEntity.LastName;
                        scUser.Profile.ProfileItemId = Constants.CustomUserProfile.ToString();
                        scUser.Profile.SetCustomProperty(UserFields.FirstName, userEntity.FirstName);
                        scUser.Profile.SetCustomProperty(UserFields.LastName, userEntity.LastName);
                        scUser.Profile.SetCustomProperty(UserFields.EmailAddress, userEntity.EmailAddress);
                        scUser.Profile.SetCustomProperty(UserFields.TelephoneNumber, userEntity.TelephoneNumber);
                        scUser.Profile.SetCustomProperty(UserFields.CompanyName, userEntity.CompanyName);
                        scUser.Profile.SetCustomProperty(UserFields.Sector, userEntity.Sector);
                        scUser.Profile.SetCustomProperty(UserFields.AddressLine1, userEntity.AddressLine1);
                        scUser.Profile.SetCustomProperty(UserFields.AddressLine2, userEntity.AddressLine2);
                        scUser.Profile.SetCustomProperty(UserFields.City, userEntity.City);
                        scUser.Profile.SetCustomProperty(UserFields.PostCode, userEntity.Postcode);
                        scUser.Profile.SetCustomProperty(UserFields.State, userEntity.State);
                        scUser.Profile.SetCustomProperty(UserFields.Country, CountryUtility.GetCountryNameById(userEntity.SelectedCountryId));

                        scUser.Profile.Save();

                        result = true;
                    
                    Membership.UpdateUser(user);

                    Log.Info(scUser.Profile.FullName, new object());
                    Log.Info(scUser.Profile.ProfileItemId, new object());
                    Log.Info(scUser.Profile.GetCustomProperty(UserFields.FirstName), new object());
                    Log.Info(scUser.Profile.GetCustomProperty(UserFields.City), new object());
                    Log.Info(scUser.Profile.GetCustomProperty(UserFields.Country), new object());
                    Log.Info(scUser.IsInRole(Constants.Roles.ExampleRole) ? "true" : "false", new object());
                
            
            else
            
                throw new Exception(Nodes.Dictionary.Fields[DictionaryFields.RegistrationForm.UsernameExists].Value);
            
        
        catch (Exception exception)
        
            Log.Error(exception.Message, "RegistrationController");
        

【问题讨论】:

【参考方案1】:

我认为从 Sitecore 加载用户时需要使用完全限定的用户名,如下所示(假设 extranet 域):

User scUser = User.FromName("extranet\\" + userEntity.EmailAddress, true);

在您的代码中似乎一切正常的原因是您从User.FromName(...) 获取了用户,无论该用户是否实际存在。

【讨论】:

这修复了用户缺少的自定义配置文件字段,谢谢。用户的角色仍未被填充 - 为了改变这一点,我在 scUser 初始化后将代码更改为以下内容:Role customUserRole = Role.FromName(Constants.Roles.CustomRole) scUser.Roles.Add(customUserRole); 问题是,如果您不通过完全限定的用户名,sitecore 总是会给您返回一个看起来真实但实际上并不存在的“垃圾”用户。这真的很令人困惑,合乎逻辑的事情是返回一个空值。

以上是关于以编程方式创建时未保存 Sitecore 用户配置文件设置的主要内容,如果未能解决你的问题,请参考以下文章

Sitecore SocialConnect 1.3:以编程方式检索用户详细信息

如果sitecore中的先前版本没有更改,如何以编程方式删除新创建的项目版本

Sitecore 以编程方式比较项目版本

以编程方式添加控件时未实例化占位符

以编程方式完成时未显示工具栏

Sitecore 非管理员用户显示隐藏项目