相关疑难解决方法(0)

如何分配配置文件值?

我不知道我缺少什么,但我在Web.config文件中添加了配置文件属性,但无法访问配置文件.代码中的项目或创建新的配置文件.

asp.net profile asp.net-mvc asp.net-membership

110
推荐指数
4
解决办法
6万
查看次数

使用ASP .NET Membership和Profile with MVC,如何创建用户并将其设置为HttpContext.Current.User?

我在代码中实现了一个自定义的Profile对象,如Joel所述:

如何分配配置文件值?

但是,当我创建一个新用户时,我无法让它工作.当我这样做:

Membership.CreateUser(userName, password);
Roles.AddUserToRole(userName, "MyRole");
Run Code Online (Sandbox Code Playgroud)

用户是创建并添加到数据库中的角色,但HttpContext.Current.User仍然是空的,并Membership.GetUser()返回null,所以这(从Joel的代码)不起作用:

static public AccountProfile CurrentUser
{
    get { return (AccountProfile)
                     (ProfileBase.Create(Membership.GetUser().UserName)); }
}

AccountProfile.CurrentUser.FullName = "Snoopy";
Run Code Online (Sandbox Code Playgroud)

我尝试过这样调用Membership.GetUser(userName)和设置Profile属性,但是set属性保持为空,并且调用AccountProfile.CurrentUser(userName).Save()不会在数据库中放置任何内容.我也试着指示用户是有效的和登录,通过调用Membership.ValidateUser,FormsAuthentication.SetAuthCookie等等,但是当前用户仍然是空的或匿名的(根据我的浏览器的cookie的状态).

解决(进一步编辑,见下文):根据Franci Penov的解释和一些更多实验,我找出了问题.Joel的代码和我尝试的变体只适用于现有的个人资料.如果不存在Profile,ProfileBase.Create(userName)则每次调用时都会返回一个新的空对象; 您可以设置属性,但它们不会"粘住",因为每次访问时都会返回一个新实例.设置HttpContext.Current.User一个新的GenericPrincipal 将会给你一个User对象,但没有一个Profile对象,ProfileBase.Create(userName)并且HttpContext.Current.Profile仍将指向新的,空的对象.

如果要在同一请求中为新创建的用户创建配置文件,则需要调用HttpContext.Current.Profile.Initialize(userName, true).然后,您可以填充初始化的配置文件并保存它,并且可以在将来的请求中按名称访问它,因此Joel的代码将起作用.我只在HttpContext.Current.Profile内部使用,当我需要在创建时立即创建/访问配置文件.在任何其他请求,我使用ProfileBase.Create(userName),并且我只公开该版本.

请注意,Franci是正确的:如果您愿意创建用户(和角色)并在第一次往返时将其设置为Authenticated,并要求用户再登录,您将能够更简单地访问该配置文件通过Joel的代码来处理后续请求.让我感到震惊的是,Roles可以在用户创建时立即访问,无需任何初始化,但Profile不是.

我的新AccountProfile代码:

public static AccountProfile CurrentUser
{
    get
    {
        if (Membership.GetUser() != null)
            return ProfileBase.Create(Membership.GetUser().UserName) as …
Run Code Online (Sandbox Code Playgroud)

membership profile asp.net-mvc createuser

17
推荐指数
1
解决办法
1万
查看次数