在通过程序集引用的内容页面上引发NullReferenceException异常

时间:2012-04-11 07:16:59

标签: c# asp.net .net exception-handling nullreferenceexception

尝试使用引用程序集中的ASPX页面时遇到此问题。此页面包含内容页面及其母版页。只有从其他Web项目访问任何内容页面webcontrol时才会引发异常,但是当从其所属的同一项目访问该页面时不会发生这种情况。

首先,这些页面应该是普通的ASPX页面,然后它们工作得很好(即这个例外没有发生),但我们的高层决定将它们包装到MasterPages中以获得一些可重用性或其他东西(其中有点奇怪,因为这个ASPX页面是自动生成的。)

所以,我们现在陷入了这个麻烦:/

编辑: 我正在添加一些代码来帮助您:)

母版页:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="MasterPage.master.cs"
Inherits="WebApplicationTemplate.MasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <asp:ContentPlaceHolder ID="headPlaceHolder" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form" runat="server">
        <asp:ContentPlaceHolder ID="formPlaceHolder" runat="server">
        </asp:ContentPlaceHolder>
    </form>
</body>
</html>

内容页面:

<%@ MasterType VirtualPath="~/MasterPage.Master" %>

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.Master" AutoEventWireup="true"
    CodeBehind="TestPage.aspx.cs" Inherits="WebApplicationTemplate.TestPage" %>

<asp:Content ID="headContent" ContentPlaceHolderID="headPlaceHolder" runat="server">
</asp:Content>
<asp:Content ID="formContent" ContentPlaceHolderID="formPlaceHolder" runat="server">
    <asp:TextBox ID="id1" runat="server" Text="Text" MaxLength="40" Style="top: 100;
        left: 100; width: 100; height: 100; position: absolute;" />
</asp:Content>

在后面的内容页面代码中引发异常的函数:

public void Foo()
{
id1.Text = "something"; //Object reference not set to an instance of an object.
}

正如我之前所说,当我通过引用的程序集从另一个项目访问此页面时,我才遇到此问题。 我不知道是否必须在任何web.config中配置某些内容,无论是在主页面项目中还是在引用前一个项目的程序集的项目中。

2 个答案:

答案 0 :(得分:0)

当您缺少正在访问其程序集的其他解决方案中存在的某些配置信息时,通常会发生此类错误。

您需要在当前项目中复制这些设置(例如,app.config或web.config),以便访问其他程序集。

希望这有帮助。

答案 1 :(得分:0)

问题解决了。

内容页面上的第一行搞砸了,所以这就是它现在的样子:

    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.Master" AutoEventWireup="true"
    CodeBehind="TestPage.aspx.cs" Inherits="WebApplicationTemplate.TestPage" %>
<asp:Content ID="headContent" ContentPlaceHolderID="headPlaceHolder" runat="server">
</asp:Content>
<asp:Content ID="formContent" ContentPlaceHolderID="formPlaceHolder" runat="server">
    <asp:TextBox ID="id1" runat="server" Text="Text" MaxLength="40" Style="top: 100;
        left: 100; width: 100; height: 100; position: absolute;" />
</asp:Content>

因此,在删除<%@ MasterType VirtualPath="~/MasterPage.Master" %>行之后,问题就解决了,尽管现在我们必须转换Page.Master属性,如果想要从ContentPage访问其字段,属性,控件等...因为删除上述行,我们不再知道我们引用哪个MasterPage类。

这样的事情:

    MasterPage MP;

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        //Setting the master page
        MP = ((WebApplicationTemplate.MasterPage)Master);
    }

    protected void Foo()
    {
        //Accessing a MasterPage control
        MP.Bar.Visible = false;
    }

好吧,就是这样。无法猜测这是如何解决我的问题,但确实如此。如果有人能够对此有所了解并满足我的好奇心,我将非常高兴。 这是不太可能的,但是,如果有人碰巧遇到这个问题,希望有人觉得这很有用。