将int的对象转换为int会给出一个空引用

时间:2012-03-14 09:00:19

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

我几个小时来一直在反对这个问题,这对我来说毫无意义。

我已经制作了一个asp.net mvc 3应用程序,我已经实现了表单身份验证。我已经创建了自己的自定义提供程序,我已经实现了GetUser(..)方法和ValidateUser(...)方法,其余的实现会抛出一个未实现的异常

我可以在登录页面上将我的登录信息提供给AccountController,我会收到一个欢迎用户名! 很好,所以登录似乎有效。

现在我的FooController上有3个动作

  • 索引
  • FirstAction
  • SecondAction

具体实现如下所示

[HttpPost]
public JsonResult FirstAction(int param1, string param2, string param3)
{
    var userID = (int)Membership.GetUser().ProviderUserKey;
    ...
}

[HttpPost]
public JsonResult SecondAction(int param1, int param2, string param3)
{
    var userID = (int)Membership.GetUser().ProviderUserKey;
    ...
}

正如您可能已经猜到的那样,我正在使用jQuery ajax功能从Index视图调用FirstAction和SecondAction。

以下行抛出null referencce异常:

var userID = (int)Membership.GetUser().ProviderUserKey;

奇怪的是,只有在SecondAction中抛出了一个null引用,这个调用在FirstAction中工作正常。

我试过像这样分开它

var user = Membership.GetUser(); 
var providerKey = user.ProviderUserKey; 
var userID = (int)providerKey. 

然而它仍然无法施放。

Membership.GetUser(..)返回的MembershipUser对象具有存储在providerUserKey中的整数,而不是常规成员资格实现所具有的Guid。

非常感谢任何形状或形式的帮助。

5 个答案:

答案 0 :(得分:8)

调试!有些东西不是你想象的那样!

var user = Membership.GetUser();
Debug.Assert(user != null);
var userKey = user.ProviderUserKey;
Debug.Assert(userKey != null);
var userID = (int)userKey;

答案 1 :(得分:3)

显然没有User返回:

Membership.GetUser()

似乎返回null。因此,所有后续调用都将导致NullReferenceException。它与密钥Guid或“¯nt”无关。

执行第二次通话时检查用户是否仍然正确登录

<强>更新
既然您声明已经尝试将其拆分并导致问题导致错误必须驻留在提供程序中。

要使其消失,请尝试在尝试投射之前将值检索到sperate变量中:

var user = Membership.GetUser();
var userIDO = user.ProviderUserKey;
var userID = (int)userIDO;

如果NullReference出现在第二行,您知道提供商有问题。

答案 2 :(得分:0)

第二个动作中的原因para​​m2是int,而不是第一个动作中的字符串,它不能为null或为空。

答案 3 :(得分:0)

我想你的用户或用户密钥都是null。所以你只需要进行相关的检查。

var user = Membership.GetUser();

if (user != null)
{
    object userKey = user.ProviderUserKey;

    if (userKey != null)
    {
        // Try convert the value to an int.

        // Do whatever.
    }
}

答案 4 :(得分:0)

MembershipUser对象的ID是uniqueidentifier类型,所以试试这个

var userID = new GUID(user.ProviderUserKey.ToString());