我正在尝试使用以下命令获取登录用户的SQL结果:
// GET: /Incident/
public ActionResult Index()
{
var loggedInUser = Membership.GetUser().ProviderUserKey.ToString();
var query = from b in db.Logs where b.Id == loggedInUser select b;
return View(query.ToList());
}
但是该方法的第一行导致NullReferenceException并且我不确定为什么?
答案 0 :(得分:2)
当前用户未登录(或您的会员提供商不相信用户已登录),导致GetUser()
方法返回null
,此时您尝试访问ProviderUserKey
,导致NullReference
例外。
您需要检查GetUser
是否返回User
或null
,并确定从该点开始做什么。你不应该假设GetUser
会给你一个user
对象。
答案 1 :(得分:1)
您应该在调用之前检查以查看用户是否已通过身份验证。如果您在用户实际登录之前尝试访问该页面,那么它将为null。
If(User.Identity.IsAuthenticated)
{
//then get the users membership information
}
答案 2 :(得分:0)
使用一些过于防御性的编程,请尝试:
public ActionResult Index()
{
if (Membership==null){
throw new ArgumentNullException("Membership");
}
var user = Membership.GetUser();
if (user ==null){
throw new ArgumentNullException("User");
}
var loggedInUser = user.ProviderUserKey.ToString();
if (loggedInUser ==null){
throw new ArgumentNullException("loggedInUser ");
}
var query = from b in db.Logs where b.Id == loggedInUser select b;
return View(query.ToList());
}
答案 3 :(得分:0)
User.Identity.GetUserID是使用ASP.Net MVC 5 auth获取用户ID的方法
答案 4 :(得分:-1)
我想指出一个对我有效的解决方案,该解决方案通常适用于以下问题:
什么:我收到此错误。我可以看到System.Web.HttpContext.Current.User.Identity.IsAuthenticated BUT ...我尚未登录。为什么?
答案:我开始让人们输入他们的电子邮件地址或用户名,然后如果我使用该电子邮件地址,我将使用我提取的用户名对电子邮件地址进行身份验证。但是你猜怎么着...
无论您在身份验证过程中做什么,“ LOGIN CONTROL”(asp.net)本身仍会使用FORMAL“ username”字段作为AS用户名,因此您需要将Username FIELD值设置为ITSELF(在进行电子身份验证之前)到您从他们键入的电子邮件中获取的提取用户名。
Dim IloginUsername As String = loginCONTROL.UserName
If iloginUsername.Contains("@") Then
user_sayingtheyare = Membership.GetUserNameByEmail(iloginUsername)
loginCONTROL.UserName = user_sayingtheyare ' KEY ADDITION
Else
user_sayingtheyare = iloginUsername
End If