请记住,我已经研究了这个并找到了几篇文章,但是,它们大部分都是旧的(比如从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
答案 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);
}