【问题标题】:Controls null when using a UserControl between projects在项目之间使用 UserControl 时控件为空
【发布时间】:2010-08-18 15:43:53
【问题描述】:

TL;DR:当调用该用户控件的 Page_Init/Page_Load 方法时,在其主项目之外使用的用户控件中的所有控件都为空。

设置是这样的:

“UI.Frontend”、“UI.ControlPanel”和“UI.Common”项目是“ASP.NET Web 应用程序”。 UI.Common 永远不会被直接访问 - 它只包含前端和控制面板都需要的用户控件。

因此,UI.Frontend 中的 aspx 文件 (SomeFrontendPage.aspx) 包含以下行:

<%@ Register tagprefix="BP" Namespace="UI.Common" Assembly="UI.Common" %>

及以后:

<BP:MyControl runat="server" ID="ctlMyControl" />

在 UI.Common 中,有一个名为 MyControl 的控件(普通 ascx、ascx.cs 和 ascx.designer.cs 文件)。现在,当我在浏览器中打开 SomeFrontendPage.aspx 时,会加载 ctlMyControl 并执行它的 init+load 方法。问题是 MyControl 的所有子控件永远不会被初始化。示例(如果 MyControl.ascx 有一个 ID 为 txtBlah 的文本字段):

    protected void Page_Init(object sender, EventArgs e)
    {
        txtBlah.Text = "test";
    }

上面的代码会运行,但会导致一个空指针(嗯,“对象引用未设置为对象的实例”),因为 txtBlah 将为空。

编辑: 一个示例控件是:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl.ascx.cs" Inherits="Common.MyControl" %>
Whatever: <asp:TextBox ID="txtWhatever" runat="server"  />

【问题讨论】:

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


    【解决方案1】:

    您可能会发现您遇到的问题比立即显示的要多。默认情况下,ASCX 文件不嵌入到程序集中,当它们嵌入时,您需要创建一个虚拟路径提供程序来访问它们。

    我们可以看一个示例控件吗?

    【讨论】:

    • 可能是这样-我最初使用寄存器组装方法,因为我找不到任何方法可以在不弄乱虚拟目录的情况下在项目之间共享控件。发布此问题后,我创建了一个包含两个空项目和上述设置的新解决方案,以尝试将此问题与我当前工作中可能存在的任何其他因素隔离开来。事实证明,跨项目的事情并不重要——“@Register Assembly”不能允许跨项目用户控件。 :(
    猜你喜欢
    • 2021-04-02
    • 2011-08-16
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2018-09-03
    相关资源
    最近更新 更多