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