Membership.GetUser结果对象引用未设置为对象的实例

时间:2014-02-03 22:52:49

标签: c# asp.net asp.net-mvc

我正在尝试使用以下命令获取登录用户的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并且我不确定为什么?

5 个答案:

答案 0 :(得分:2)

当前用户未登录(或您的会员提供商不相信用户已登录),导致GetUser()方法返回null,此时您尝试访问ProviderUserKey,导致NullReference例外。

您需要检查GetUser是否返回Usernull,并确定从该点开始做什么。你不应该假设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