【问题标题】:Getting namespace name not found for ASP.net user control获取 ASP.net 用户控件的命名空间名称未找到
【发布时间】:2010-10-23 23:47:46
【问题描述】:

所以我在尝试发布网站时遇到了问题。 我在 Visual Studio 2008 sp1 中。

我有一堆用户控件,并且在一些页面上我以编程方式使用它们。

我在 aspx 页面上有一个参考

<%@ Reference Control="~/UserControls/Foo.ascx" %>

然后是我使用的代码

ASP.usercontrols_foo newFoo control = (ASP.usercontrols_foo)Page.LoadControl("~/UserControls/Foo.ascx");

如果我导航到该页面,它可以正常工作,但是当我发布该网站时,我会收到编译时错误。

【问题讨论】:

    标签: asp.net user-controls


    【解决方案1】:

    啊,我在同一个问题上浪费了开发时间。有没有人可以解决这个问题?

    顺便说一句:如果您取消选中“允许此预编译站点可更新”,它就会构建(右键单击网站,选择属性页,MSBuild 选项)

    但我需要网站是可更新的。

    【讨论】:

    • 1+,在过去,我遇到了同样的问题,因为我无法解决它,我使用了反射。我也想知道如何解决这个问题。
    【解决方案2】:

    我也遇到了同样的问题 - 实际上,在我的情况下,我可以让它编译和构建我的网站,但是在进行自动构建时它会爆炸。

    尝试如下替换您的代码:

    ASP.usercontrols_foo newFoo control = (ASP.usercontrols_foo)Page.LoadControl("~/UserControls/Foo.ascx");
    

    USERCONTROLS_Foo newFoo control = (USERCONTROLS_Foo)Page.LoadControl("~/UserControls/Foo.ascx");
    

    (大小写取决于您如何大写目录名称/控件名称 - 但无论哪种情况都应适当突出显示)。

    【讨论】:

      【解决方案3】:

      为用户控制指定一个命名空间(参见Dynamically Load a user control (ascx) in a asp.net website)。

      【讨论】:

        【解决方案4】:

        我已经找到了解决方案。如果我将在用户定义的命名空间中声明控件,那么我可以直接使用控件而无需使用 ASP 或将其引用到 aspx 页面中。

        【讨论】:

          【解决方案5】:

          这可能与特定类型不可用有关。您能否更改控件引用,以便类型和强制转换只使用基本 Control 类:

          Control control = Page.LoadControl("~/UserControls/Foo.ascx");
          

          【讨论】:

            【解决方案6】:

            是的,我可以将它施放给 Control。但是后来我无法直接访问用户控件上的方法。

            我知道我可以通过反映到控件中来访问这些方法,并且我已经成功地做到了,但是对于访问网站上的所有其他用户控件来说,这远非理想。

            另外,后续错误是找不到标记上的用户控件

            <%@ Register src="CategoryRows.ascx" tagname="CategoryRows" tagprefix="abc" %>
            <abc:CategoryRows ID="CategoryRows" runat="server" />
            

            请注意,如果我基本上 XCopy 整个站点(源代码和所有),我可以在本地和服务器上成功运行该站点。但发布失败。

            【讨论】:

            • Riaz,您发布网站时是否勾选了“使用固定命名和单页程序集”?
            • 我尝试过选中和取消选中“使用固定命名和单页程序集”。 (“允许此预编译站点可更新”在这两种情况下都被选中)我收到相同的错误:“名称空间 'ASP' 中不存在类型或名称空间名称 'some_user_control_ascx'(您是否缺少程序集引用?)”
            【解决方案7】:

            铸造用户控件可能会产生很多问题。我的方法是创建一个类(比如控件类),将你需要的所有属性和方法放在铸造后并从 System.Web.UI.UserControl 继承这个类。然后在你的用户控制代码文件而不是 System.Web.UI.UserControl 用户这个控制类。

            现在,当您只需要使用此类进行强制转换时。它也将是轻型铸造。

            【讨论】:

            • 如果您需要动态加载,那不是很有用。动态加载需要 Page.LoadControl,它只返回 Control。如果有的话,我必须派生所有页面来指定加载不同用户控件的能力。
            • 即使控件是动态添加的。我们总是可以将控件转换为它的基类。 '---------------------------- ctrl = Page.LoadControl("~/DashBoardControl/BroadCastView.ascx") PlaceHolder1.Controls.Add(ctrl ) 使用 DirectCast(ctrl, BraodCastView) If Not ctrl Is Nothing Then '------------------------------------ -------------- 这里 BraodCastView 是 BroadCastView.ascx 的基类,它永远不会失败。
            【解决方案8】:

            请检查:

            您有任何website.publishproj 文件吗?
            如果存在,则删除并重试并发布代码。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-12-10
              • 2013-03-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多