来自 class 库的用户控件中的 NullReferenceException,但不是来自 Web 项目
NullReferenceException in usercontrol from class library, but not from web project
我有以下项目结构,其中 Web 应用程序可能包含来自同一 Web 项目或来自单独 class 库的用户控件。问题出在 Default.aspx.cs,当我执行 usercontrol2.SetValues();
时,我收到 NullReferenceException
因为某些原因 textbox2
为空。我试过使用 EnsureChildControls();
但它也无济于事。我应该以其他方式注册或调用这些用户控件吗?为什么它不能开箱即用?
Web 项目中的用户控件
WebUserControl1.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebApplication1.WebUserControl1" %>
<asp:TextBox runat="server" ID="textbox1"></asp:TextBox>
WebUserControl1.ascx.cs
namespace WebApplication1
{
public partial class WebUserControl1 : System.Web.UI.UserControl
{
public void SetValues()
{
textbox1.Text = "Hello";
}
}
}
class 库中的用户控件
WebUserControl2.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl2.ascx.cs" Inherits="ClassLibrary1.WebUserControl2" %>
<asp:TextBox runat="server" ID="textbox2"></asp:TextBox>
WebUserControl2.ascx.cs
namespace ClassLibrary1
{
public partial class WebUserControl2 : System.Web.UI.UserControl
{
public void SetValues()
{
textbox2.Text = "world";
}
}
}
主页
Default.aspx
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
<%@ Register tagPrefix="web" tagName="WebUserControl1" src="WebUserControl1.ascx" %>
<%@ Register TagPrefix="web" Namespace="ClassLibrary1" Assembly="ClassLibrary1" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<web:WebUserControl1 runat="server" ID="usercontrol1"></web:WebUserControl1>
<web:WebUserControl2 runat="server" ID="usercontrol2"></web:WebUserControl2>
</asp:Content>
Default.aspx.cs
using System;
using System.Web.UI;
namespace WebApplication1
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
usercontrol1.SetValues(); // OK
usercontrol2.SetValues(); // NullReferenceException
}
}
}
无法使用来自不同程序集的 ascx 用户控件。
我觉得你应该这样看这个问题。您的类库被编译成 dll-file。这是您的网络应用程序唯一可用的东西。 “ascx”没有被编译到 dll 中,并且不可用。
如果您真的想将某些控件与 web-project 分开,我认为有以下几种选择:
将您的用户控件转换为自定义控件。自定义控件创建起来有点困难,但肯定不是不可能的。这样你就真正得到了一个re-usable控件。
另见这个问题;它解决了您的问题,并且还有一个 link 算法可以将 ascx 用户控件“转换”为自定义控件。 (我没测试过)
确保您的 ascx 文件对 web-project 可用,方法是发布到输出中的路径。然后使用 LoadControl 在服务器端加载它们。这可能行得通,但我也认为您的类库中的一些可重用性丢失了。
我有以下项目结构,其中 Web 应用程序可能包含来自同一 Web 项目或来自单独 class 库的用户控件。问题出在 Default.aspx.cs,当我执行 usercontrol2.SetValues();
时,我收到 NullReferenceException
因为某些原因 textbox2
为空。我试过使用 EnsureChildControls();
但它也无济于事。我应该以其他方式注册或调用这些用户控件吗?为什么它不能开箱即用?
Web 项目中的用户控件
WebUserControl1.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebApplication1.WebUserControl1" %>
<asp:TextBox runat="server" ID="textbox1"></asp:TextBox>
WebUserControl1.ascx.cs
namespace WebApplication1
{
public partial class WebUserControl1 : System.Web.UI.UserControl
{
public void SetValues()
{
textbox1.Text = "Hello";
}
}
}
class 库中的用户控件
WebUserControl2.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl2.ascx.cs" Inherits="ClassLibrary1.WebUserControl2" %>
<asp:TextBox runat="server" ID="textbox2"></asp:TextBox>
WebUserControl2.ascx.cs
namespace ClassLibrary1
{
public partial class WebUserControl2 : System.Web.UI.UserControl
{
public void SetValues()
{
textbox2.Text = "world";
}
}
}
主页
Default.aspx
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
<%@ Register tagPrefix="web" tagName="WebUserControl1" src="WebUserControl1.ascx" %>
<%@ Register TagPrefix="web" Namespace="ClassLibrary1" Assembly="ClassLibrary1" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<web:WebUserControl1 runat="server" ID="usercontrol1"></web:WebUserControl1>
<web:WebUserControl2 runat="server" ID="usercontrol2"></web:WebUserControl2>
</asp:Content>
Default.aspx.cs
using System;
using System.Web.UI;
namespace WebApplication1
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
usercontrol1.SetValues(); // OK
usercontrol2.SetValues(); // NullReferenceException
}
}
}
无法使用来自不同程序集的 ascx 用户控件。
我觉得你应该这样看这个问题。您的类库被编译成 dll-file。这是您的网络应用程序唯一可用的东西。 “ascx”没有被编译到 dll 中,并且不可用。
如果您真的想将某些控件与 web-project 分开,我认为有以下几种选择:
将您的用户控件转换为自定义控件。自定义控件创建起来有点困难,但肯定不是不可能的。这样你就真正得到了一个re-usable控件。 另见这个问题;它解决了您的问题,并且还有一个 link 算法可以将 ascx 用户控件“转换”为自定义控件。 (我没测试过)
确保您的 ascx 文件对 web-project 可用,方法是发布到输出中的路径。然后使用 LoadControl 在服务器端加载它们。这可能行得通,但我也认为您的类库中的一些可重用性丢失了。