1

我正在使用 ASP.NET MVC 3。我正在使用 Visual Studio 项目模板中免费提供的内容,用于带有“Internet 应用程序”选项的 MVC 项目。基本上,这带来了表单身份验证,并提供了一些基本元素来管理用户登录和内容。

我还使用网络配置文件来存储一些自定义字段。一切都很顺利。我将SuperFunProfile其用作实例的包装器,Profile以便更轻松地获取配置文件属性。

直到我想在用户注册后立即设置个人资料的属性。

我无法解决的问题是this.Request.RequestContext.HttpContext.Profile包含匿名用户的配置文件。既然用户应该注册并登录,我如何才能为他获取新的个人资料?

    public ActionResult SignUp(SignUpModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            MembershipCreateStatus createStatus = this.MembershipService.CreateUser(model.UserName, model.Password, model.Email);

            if (createStatus == MembershipCreateStatus.Success)
            {
                this.FormsService.SignIn(model.UserName, false /* createPersistentCookie */);

                var profile = new SuperFunProfile(this.Request.RequestContext.HttpContext.Profile);
                profile.DisplayName = model.UserName;
                profile.Save();

                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError(string.Empty, AccountValidation.ErrorCodeToString(createStatus));
            }
        }

我浏览了 Membership 和 Web.Profile,但我没有看到任何看起来可以让我更接近目标的东西。

也许我应该创建一个 ProfileModel 将自己存储到数据库中,而不是使用 Web.Profile?我想,我可以键入MembershipUser.ProviderUserKey可以更容易在注册时创建 ProfileModel 的键。

4

1 回答 1

2

我认为您可以使用MigrateAnonymous事件。

当用户登录时(即,当他们不再是匿名用户时),将引发 MigrateAnonymous 事件。如有必要,您可以处理此事件以将信息从用户的匿名身份迁移到新的经过身份验证的身份。以下代码示例显示了如何在用户通过身份验证时迁移信息。

在你的 global.asax 中使用类似的东西

public void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs args)
{
  ProfileCommon anonymousProfile = Profile.GetProfile(args.AnonymousID);

  Profile.ZipCode = anonymousProfile.ZipCode; //Your custom property
  Profile.CityAndState = anonymousProfile.CityAndState;//Your custom property
  Profile.StockSymbols = anonymousProfile.StockSymbols;//Your custom property

  ////////
  // Delete the anonymous profile. If the anonymous ID is not 
  // needed in the rest of the site, remove the anonymous cookie.

  ProfileManager.DeleteProfile(args.AnonymousID);
  AnonymousIdentificationModule.ClearAnonymousIdentifier(); 

  // Delete the user row that was created for the anonymous user.
  Membership.DeleteUser(args.AnonymousID, true);

}
于 2010-10-30T19:43:00.717 回答