C# 将int对象强制转换为int将提供空引用

C# 将int对象强制转换为int将提供空引用,c#,asp.net-mvc,membership-provider,C#,Asp.net Mvc,Membership Provider,我已经为这个问题绞尽脑汁好几个小时了,这对我来说毫无意义 我制作了一个asp.NETMVC3应用程序,实现了表单身份验证。我已经创建了自己的自定义提供程序,其中我实现了GetUser(…)方法和ValidateUser(…)方法,其余的实现抛出一个未实现的异常 我可以在登录页面上向AccountController提供我的登录信息,我会收到一个欢迎用户名! 太好了,所以登录看起来很有效 现在我的FooController上有3个操作 索引 第一行动 第二行动 具体实现如下所示 [HttpPo

我已经为这个问题绞尽脑汁好几个小时了,这对我来说毫无意义

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

我可以在登录页面上向AccountController提供我的登录信息,我会收到一个欢迎用户名! 太好了,所以登录看起来很有效

现在我的FooController上有3个操作

  • 索引
  • 第一行动
  • 第二行动
具体实现如下所示

[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;
    ...
}
正如您可能已经猜到的,我正在使用jqueryajax功能从我的
Index
视图调用FirstAction和SecondAction

以下行引发null referencec异常:

var userID = (int)Membership.GetUser().ProviderUserKey;
奇怪的是,只有在SecondAction中抛出空引用,调用在FirstAction中才能正常工作


我试过这样把它分开

var user = Membership.GetUser(); 
var providerKey = user.ProviderUserKey; 
var userID = (int)providerKey. 
但它仍然失败

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


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

因为第二个操作中的param2是int,而不是第一个操作中的string,它不能为null或空。

因此显然没有
用户返回:

Membership.GetUser()
似乎返回null。因此,所有后续调用都将导致
NullReferenceException
。它与键是
Guid
或ìnt`无关

执行第二次调用时,检查用户是否仍正确登录

更新
由于您声明已尝试将其拆分,并且导致问题的强制转换必须驻留在提供程序中

要将其删除,请在尝试强制转换之前,尝试将该值检索到sperate变量中:

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

如果第二行出现
NullReference
,您就知道提供程序有问题。

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

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

我认为您的用户或用户密钥为空。因此,您只需要执行相关检查

var user = Membership.GetUser();

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

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

        // Do whatever.
    }
}

确保该值不为null并使用

Convert.ToInt32(Membership.GetUser().ProviderUserKey)

不要强制转换为
int
,以避免装箱/取消装箱问题。

MembershipUserobject的ID是典型的uniqueidentifier,因此请尝试此操作

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

它们的顺序是什么?嗯。。。它不是int的对象,而是null。。是吗?@Henkholtman你调用方法的序列没有effect@gdoronProviderUserKey是intIf类型的对象,如果您在该行上获得nullref异常,那么显然
Membership.GetUser()
返回
null
。Membership.GetUser()如何.ProviderUserKey与操作中定义的参数有任何关系吗?我尝试过像这样拆分它:var user=Membership.GetUser();var providerKey=user.ProviderUserKey;var userID=(int)providerKey。但它仍然会失败,因为您仍在尝试调用不存在的属性(因为用户为null)或将null值强制转换为不允许null(int)的值类型。使用进一步的疑难解答信息更新了问题。一般来说,在这些情况下,最好将所有步骤分解,以查看错误实际发生的位置。您还提到,调试器可以很好地显示该值,但这并不总是一个指标,因为这不是一个无状态进程,调试器有时会看到代码无法看到的其他东西,因为它在不同的环境中运行context@ntziolis异常发生在第三行,即(int)userIDO的实际强制转换,关于调试器的评论可能显示了错误的值,这让我感到害怕,我喜欢信任我的调试器:
userIDO
的值是什么?然后,在调试时?我测试了一下,在我发布问题之前,在我转换.ToInt32(providerKey)时引发了相同的异常,见鬼,我甚至重新启动了,因为我认为巫毒正在我的机器上运行,但它在重新启动后的表现是一样的。你需要在回答中提供更多的细节,而不是一行代码,并说“试试这个”。这是如何解决OP的问题的,或者为什么它是一个更好的选择。