MVC会员资格&档案策略

时间:2012-07-31 19:48:12

标签: asp.net-mvc vb.net asp.net-mvc-3 asp.net-membership

请记住,我已经研究了这个并找到了几篇文章,但是,它们大部分都是旧的(比如从2008年开始),所以我想要了解有关ASP.NET MVC最新版本的最新信息。 / p>

我使用Membership内置的东西来提供用户注册,登录和角色。

我也想使用个人资料功能。

我不知道如何创建配置文件,我找不到任何关于如何在MVC 3中执行此操作的文章。我发现一个使用MVC 2,也许它是相同的,但我想使用最新的可用方法

有人可以向我展示创建个人资料的一步一步的解决方案吗?

我正在考虑使用自己的会员类+表单身份验证。这样,创建配置文件就像分配外键一样简单......

专家的意见是什么?

请用VB而不是C#提供你的答案(我不知道为什么每个人都用C#写我的东西)。

感谢。

编辑:这是我的注册功能:

'
' POST: /Account/Register

<HttpPost()> _
Public Function Register(ByVal model As RegisterModel) As ActionResult
    If ModelState.IsValid Then
        ' Attempt to register the user
        Dim createStatus As MembershipCreateStatus
        Membership.CreateUser(model.UserName, model.Password, model.Email, Nothing, Nothing, True, Nothing, createStatus)

        If createStatus = MembershipCreateStatus.Success Then
            FormsAuthentication.SetAuthCookie(model.UserName, False)
            Return RedirectToAction("Index", "Home")
        Else
            ModelState.AddModelError("", ErrorCodeToString(createStatus))
        End If
    End If

    ' If we got this far, something failed, redisplay form
    Return View(model)
End Function

1 个答案:

答案 0 :(得分:1)

就个人而言,我建议不要使用SQL Profile Provider(这是你正在使用的)。自MVC2以来,配置文件没有任何改变(或者,就此而言,因为它是在带有.NET 2.0的webforms中引入的)。

原因是:配置文件数据作为XML存储在数据库中,这使得在应用程序之外使用配置文件数据非常困难(意味着在纯SQL查询中)。

直接在数据库中创建配置文件字段可能要好得多。这样您就可以知道数据来自哪个表/列,并且可以根据需要创建视图。否则,您必须解析表列的XML以提取配置文件数据(这是ProfileCommon在.NET中的功能)。

回复评论

首先,我对属性名称错了。它是ProviderUserKey,而不是ProviderKey。但是,除非您要为匿名用户存储配置文件属性,否则您可以轻松地使用MembershipUser.UserName作为您的FK值,因为它也是唯一的。

[HttpPost]
public ActionResult Register(RegisterModel model)
{
    MembershipCreateStatus createStatus;
    var membershipUser = Membership.CreateUser(model.UserName, model.Password, 
        model.Email, null, null, true, null, out createStatus);

    if (createStatus == MembershipCreateStatus.Success)
    {
        var providerKeyObject = membershipUser.ProviderUserKey;
        var providerKeyGuid = (Guid)membershipUser.ProviderUserKey;
        // Use providerKeyGuid as a foreign key when inserting into a profile
        // table. You don't need a real db-level FK relationship between
        // your profile table and the aspnet_Users table. You can lookup this
        // Guid at any time by just getting the ProviderUserKey property of the
        // MembershipUser, casting it to a Guid, and executing your SQL.

        // Example using EF / DbContext
        using (var db = new MyDbContext())
        {
            var profile = new MyProfileEntity
            {
                UserId = providerKeyGuid, // assumes this property is a Guid
                FirstName = model.FirstName,
                LastName = model.LastName,
            };
            db.Set<MyProfileEntity>().Add(profile);
            db.SaveChanges();
        }

        // you could get the profile back out like this
        using (var db = new MyDbContext())
        {
            var profile = db.Set<MyProfileEntity>().SingleOrDefault(p => 
                p.UserId == (Guid)membershipUser.ProviderUserKey);
        }
        FormsAuthentication.SetAuthCookie(membershipUser.UserName, false);
        return RedirectToAction("Index", "Home");
    }
    return View(model);
}

以下是使用UserName而不是ProviderUserKey的示例。如果您不存储匿名用户的个人资料信息,我会推荐这种方法:

[HttpPost]
public ActionResult Register(RegisterModel model)
{
    MembershipCreateStatus createStatus;
    var membershipUser = Membership.CreateUser(model.UserName, model.Password, 
        model.Email, null, null, true, null, out createStatus);

    if (createStatus == MembershipCreateStatus.Success)
    {
        // Example using EF / DbContext
        using (var db = new MyDbContext())
        {
            var profile = new MyProfileEntity
            {
                // assumes this property is a string, not a Guid
                UserId = membershipUser.UserName,
                FirstName = model.FirstName,
                LastName = model.LastName,
            };
            db.Set<MyProfileEntity>().Add(profile);
            db.SaveChanges();
        }

        // you could get the profile back out like this, but only after the 
        // auth cookie is written (it populates User.Identity.Name)
        using (var db = new MyDbContext())
        {
            var profile = db.Set<MyProfileEntity>().SingleOrDefault(p => 
                p.UserId == User.Identity.Name);
        }
        FormsAuthentication.SetAuthCookie(membershipUser.UserName, false);
        return RedirectToAction("Index", "Home");
    }
    return View(model);
}