【问题标题】:System.NullReferenceException: Object reference not set to an instance of an objectSystem.NullReferenceException:对象引用未设置为对象的实例
【发布时间】:2013-06-25 11:36:19
【问题描述】:

我正在使用 asp.net LoginView 向经过身份验证的用户和匿名用户显示不同的数据。

<asp:LoginView ID="LoginView1" Runat="server">
    <LoggedInTemplate>
        <asp:Label ID="Foo" runat="server" />
    </LoggedInTemplate>
    <AnonymousTemplate>
        <asp:Label ID="Bar" runat="server" />
    </AnonymousTemplate>
</asp:LoginView>

然后我在我的 c# 文件中访问这些标签,如下所示:

Label Foo = (Label)LoginView1.FindControl("Foo");
Foo.Text = "whatever";

我得到的错误是:

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

【问题讨论】:

  • 您能否也添加您的堆栈跟踪详细信息?
  • 它好像没有找到你的标签,在尝试使用它之前尝试测试 Foo 不为空。
  • 欢迎来到 Stack Overflow!几乎所有NullReferenceException 的情况都是一样的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。

标签: c# asp.net visual-studio-2008 nullreferenceexception loginview


【解决方案1】:

大概在执行时,用户没有登录 - 所以没有 ID 为Foo 的控件,所以FindControl 返回null。您应该单独检测用户是否登录并要求正确的控制,或者在使用之前检查Foo是否为null。 (您可能需要考虑将局部变量重命名为 foo 以更符合 C# 约定。)

【讨论】:

  • 你怎么不是 C# MVP ?确实,微软需要为你颁发 C# 终身成就奖。 :-)
【解决方案2】:

试试这个:

Label Foo = (Label)LoginView1.FindControl("Foo");
if(Foo != null)
{
    Foo.Text = "whatever";
}

现在您不会收到错误消息,但如果Foo 为空,那么您的标签文本将不会更新。您需要确定为什么它找不到名为“Foo”的Label

【讨论】:

  • 这里检查 null 不奇怪吗?如果您创建了一个名为 Foo 的控件,怎么会没有呢?
  • @AndersLindén - 因为有两个不同的模板; LoggedInTemplateAnonymousTemplate,因此Foo 标签可能不存在,因为如果AnonymousTemplate 处于活动状态,则Bar 标签将存在而Foo 标签将不存在。
【解决方案3】:

你需要检查空值:

object labelObj = LoginView1.FindControl("Foo")
if(labelObj != null)
{
    Label Foo = (Label)labelObj;
    if(Foo.Text!=null)
        Foo.Text="whatever";
}

【讨论】:

  • 效率不高。 FindControl() 结果应该被缓存,所以你不需要调用它两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
相关资源
最近更新 更多