【问题标题】:ASP.net Null Reference Exception Due to Not Finding Controls由于未找到控件,ASP.net 空引用异常
【发布时间】:2015-11-26 23:47:24
【问题描述】:

我遇到了这个异常,我不知道为什么会这样。我搜索了这个网站和其他人试图找到解决方案,但到目前为止都没有成功。

问题

我的 .aspx 页面中有以下两个 div。

<div ID="success" style="visibility:hidden" runat="server">
// buttons and textfields
</div>

<div ID="fail" style="visibility:hidden" runat="server">
// buttons and textfields
</div>

在页面加载时,我希望根据某些标准将其变为可见。但是,当我尝试在后面的代码中定位它们以更改它们的可见性时,它会给我一个 NullReferenceException 指向试图更改它们的可见性的代码。

代码

这是我在后面的代码中使用的代码。

fail.Style.Add("visibility", "hidden");
success.Style.Add("visibility", "Visible");

我也试过了:

fail.Attributes.Add("style", "visibility:Visible");
success.Attributes.Add("style", "visibility:Visible");

我在另一个 .aspx 页面上执行了完全相同的操作,但在该页面上没有给我这个 NullReferenceException。所以我不知道发生了什么。有人可以帮忙吗?


newBin.aspx.cs 的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using System.Data.Common;

namespace SMTInventory
{
    public partial class newBin : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.PreviousPage != null)
            {
                HiddenField pkid_box = (HiddenField)Page.PreviousPage.FindControl("locationID");
                string pkid = pkid_box.Value;
                locationID.Value = pkid;
                success.Style.Add("visibility", "Visible");
            }
            else
            {
                if (Page.FindControl("fail") != null)
                {
                    fail.Style.Add("visibility", "hidden");
                    success.Style.Add("visibility", "Visible");
                }
                else
                {
                    fail.Style.Add("visibility", "hidden");
                    success.Style.Add("visibility", "Visible");
                }

            }
        }

        protected void btnNewLocation_Click(object sender, EventArgs e)
        {
            Server.Transfer("newLocation.aspx", true);
        }

        protected void btnNewBin_Click(object sender, EventArgs e)
        {

        }
    }
}

newBin.aspx 的代码

<%@ Page Title="New Bin" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="newBin.aspx.cs" Inherits="SMTInventory.newBin" %>

<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
    <hgroup class="title">
        <h1><%: Title %>.</h1>
        <h2>Add a New Bin</h2>
    </hgroup>

    <article>
        <div ID="success" style="visibility:hidden" runat="server">
            <asp:HiddenField ID="locationID" value="" runat="server" />
            How many racks are in this bin? <asp:TextBox ID="binCount" runat="server" /><br />
            <asp:button id="btnNewBin" onclick="btnNewBin_Click" runat="server" text="Add Bin" />
        </div>

        <div ID="fail" style="visibility:hidden" runat="server">
            <p>This page cannot be used without first creating a new location.<br /></p>
            <asp:Button ID="btnNewLocation" onclick="btnNewLocation_Click" runat="server" Text="Create New Location" />
        </div>
    </article>

    <aside>
        <h3>Aside Title</h3>
        <p>        
            Use this area to provide additional information.
        </p>
        <ul>
            <li><a runat="server" href="~/">Home</a></li>
            <li><a runat="server" href="~/About">About</a></li>
            <li><a runat="server" href="~/Contact">Contact</a></li>
        </ul>
    </aside>
</asp:Content>

Site.Master 的一部分

<div id="body">
        <asp:LoginView runat="server" ViewStateMode="Disabled">
            <AnonymousTemplate>
                <asp:ContentPlaceHolder runat="server" ID="FeaturedContent" />
                <section class="content-wrapper main-content clear-fix">
                    <asp:ContentPlaceHolder runat="server" ID="MainContent" />
                </section>
                <asp:ContentPlaceHolder runat="server" ID="NewContent" />
            </AnonymousTemplate>
            <LoggedInTemplate>

            </LoggedInTemplate>
        </asp:LoginView>
    </div>

【问题讨论】:

  • 尝试将 ClientIDMode="Static" 添加到两个 div 之一。我非常怀疑它会有所作为,但值得一试。
  • 我喜欢 Daniel A White 在他未阅读时将其标记为已询问的方式,因为我已经在该站点上搜索了 NullReferenceException 和解决方案,但 NONE 已成功。 Nicholas V. 我会试试看它是否会改变。
  • 我确实跟踪它并尝试调试它。它告诉我我的引用未设置为对象的实例。我已经在我的另一个页面上完成了这个确切的代码,它没有给我这个异常。
  • 您的页面指令是否为当前页面正确格式化?这将是您的 ASPX 代码的第一行。
  • 用户是匿名的还是 LoggedInTemplate 为简洁起见为空?

标签: c# asp.net nullreferenceexception web-controls


【解决方案1】:

根据我的经验,DIV 没有像 ASP 控件那样注册到服务器,因此直接调用它们会产生不好的结果。在对控件进行更改(即添加样式)时,请务必告诉 ASP 您拥有哪种控件。

例如:

HtmlGenericControl _fail = (HtmlGenericControl)Page.FindControl("fail");

_fail.Style.Item("visibility") = "hidden";

编辑:问题在于 ContentPlaceHolder 嵌套在 LoginView 中。深入到控件应该会暴露它们。

例子:

LoginView temp = (LoginView)this.Master.FindControl("LoginView1");
ContentPlaceHolder tempp = (ContentPlaceHolder)temp.FindControl("MainContent");
HtmlGenericControl _fail = (HtmlGenericControl)tempp.FindControl("fail");

如果您创建一些类变量来指向这些控件并在页面加载时分配它们,那么您可以从代码中的任何位置调用它们。

为了给解决方案增加更多的混乱,如果你只添加:

LoginView temp = (LoginView)this.Master.FindControl("LoginView1");
ContentPlaceHolder tempp = (ContentPlaceHolder)temp.FindControl("MainContent");

到 Page_Load ,仅此而已,它公开了控件,因此您可以直接调用 fail.Style.Add("visibility", "hidden") 。 ASP 枚举控件的时间似乎有些延迟。在 LoginView 上调用 FindControls() 似乎会刷新控件“缓存”,从而按照您的预期显示控件。

【讨论】:

  • 在 SMTInventory.dll 中发生了“System.NullReferenceException”类型的异常,但未在用户代码中处理其他信息:对象引用未设置为对象的实例。此错误指向 _fail.Style 行。
  • LoginView 正在向您隐藏您的控件。请参阅上面的编辑。
  • 目前都是匿名的,但这样做修复了它。 LoginView 是否会以某种方式导致控件在用户身份验证建立之前不显示?
  • 我认为这不是身份验证问题。按照设计,要访问 ContentPlaceHolder 中的控件,您需要获取母版页中 PlaceHolder 的句柄。 LoginView 正在创建另一层(嵌套) MainContent 占位符,您必须先将其剥离,然后才能找到该级别的控件。
  • 这个页面和我上一个页面的唯一区别是控件引用是在此处的Page_Load和上一页的Button_Click上完成的。 Page_Load 和控件创建之间是否存在间隙,其中 Page_Load 在控件“活动”之前发生?
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多