如何从FirstName和LastName等数据库中获取SimpleMembershipProvider扩展属性?

时间:2013-08-07 18:48:13

标签: c# asp.net-mvc-4 webmatrix membership-provider user-profile

在这篇文章SimpleMemberShipProvider, Using multiple PropertyValues with custom Database tables之后,我使用SimpleMembershipProvider和WebMatrix.WebData.WebSecurity成功创建了一个新用户。

WebSecurity.CreateUserAndAccount(model.UserName, model.Password,new { FirstName = model.FirstName,LastName = model.LastName,AppId = Guid.NewGuid(), MemberId = model.MemberId});

但是,我无法找到任何用于从MembershipProvider或WebSecurity方法中检索此信息的内置方法。我知道我可以直接查询数据库以获取信息并进行更新,但随后我的代码将与此测试实现紧密结合。

任何人都知道如何从SimpleMembershipProvider中当前登录的用户获取扩展属性?感谢。

2 个答案:

答案 0 :(得分:1)

据我所知,您必须使用当前的ORM框架查询该表。 SimpleMembershipProvider和WebSecurity允​​许你基本的东西,例如WebSecurity.CurrentUserName,WebSecurity.UserExists,WebSecurity.GetUserId等。

您添加到SimpleMembershipProvider创建的任何表中的自定义列必须从表中手动获取。

SimpleMembershipProvider不知道您将FirstName和LastName添加到UserProfile(或其他表)表中。

答案 1 :(得分:1)

然而,SBirthare是正确的,因为他没有解释如何这样做,请允许我(假设你使用C#服务器端语言选项,你标记了,所以我相信你这么做。这也假设“FirstName”和“LastName”列所属的表名实际上是“UserProfile”):

由于WebMatrix附带SQL Server-CE,我们可以使用简单的SQL查询。

首先建立与数据库的连接:

var db = Database.Open("Users");

接下来,编译用于查询的相应字符串(使用简单的字符串变量):

string selectQueryString = "SELECT FirstName, LastName FROM UserProfile";

传递给Query() C#方法(如下所示)时的上述字符串将返回从数据库返回的所有“FirstName”和“LastName”的列表(具体为IEnumerable<dynamic>) 。如果你只想要返回某些行,你可以在SQL字符串中使用WHERE子句,所以你可以改为使用上面的字符串(这只是一个例子,你必须定制自己的条件才能适应你的情况,但这应该给你一个简单的例子):

string selectQueryString = "SELECT FirstName, LastName FROM UserProfile WHERE Email = @0 AND UserID = @1";

首先让我说明@0@1的内容,以防您不知道。它们是占位符,最终会被你想要测试的条件(更多关于此进一步向下)使用这种方法,称为“参数化查询”,这将是你对SQL注入攻击的冒烟。简而言之:总是使用这种方法来测试条件中的条件(我真的不能强调这一点)。

现在,我不确定您对SQL查询了解多少,但它们非常强大且有用,可以使用LIKEORDER BYGROUP BY,{ {1}},JOINUNIONAND,甚至是子查询,以及许多其他关键字和方法,您可以真正使SQL查询返回任何您的任何内容欲望,按照你想要的顺序(可以在这里找到一个很棒的初学者SQL查询教程:http://www.sqlcourse.com/index.html)。

好的,继续......一旦你按照你想要的方式编写了selectQueryString,你只需要存储它,就像这样:

OR

并显示它,如下:

int ID = 6;
string email = "testEmailName@gmail.com";
var queryResultsList = db.Query(selectQueryString, email, ID); //Here the first argument passed to the `db.Query()` method is the query string, but each additional argument passed (and you can actually pass an array of values here instead if you want) is used to fill the `@0` and `@1` placeholders you formed in your string earlier (order is ever important here!).

很抱歉,如果这需要很多,但我想我至少会向您展示实际实现这一目标所需的所有步骤。真的没有那么多,我只想给你一些有用的指针:)

无论如何,如果您有任何问题或者我需要澄清任何问题,请告诉我。

修改

好吧,我刚刚看到你使用MVC而不是Web页面。我的答案来自Web-Pages环境,但说实话,我不确定它是否会有所不同,因为我从未使用过MVC。无论哪种方式,SQL查询本身应该是相同的,因为我们都使用C#,idk。

无论哪种方式,如果我被告知这个答案不适合你的情况或对你没用,我会很高兴删除它。