ASP/C#代码隐藏无法从标记中访问控件

本文关键字:访问 控件 代码 隐藏 ASP | 更新日期: 2023-09-27 18:19:45

问题:
我有一个这样的标记(只有重要的行):

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="RTDeluxe.ascx.cs"
Inherits="MainSolution.CONTROLTEMPLATES.Kunde.RTDeluxe" %>
<ul id="linkUl" class="teaserLinksUL" runat="server"/>

背后的代码:

namespace MainSolution.CONTROLTEMPLATES.Kunde
public partial class RTDeluxe : UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        linkUl.InnerHtml = string.Empty;
    }
}

我可以访问代码背后的ul,不会出现编译错误。但是,当我调试代码时,我会得到一个NullReferenceException,因为linkUl是NULL。

首先,我认为名称空间是原因。但是,经过几次尝试,我确信它们是正确的。FileLocation似乎是正确的,我的iis的controltemplates文件夹有一个"Kunde"文件夹,里面有相应的ascx文件。

我还有其他结构相同的.ascx文件->它们工作起来很有魅力。

问题:
除了命名空间之外,还有其他原因导致这种行为吗?你有什么线索可以让我看看吗?

编辑:
RTDeluxe.ascx.designer.cs文件存在,生成的linkUl如下所示:

protected global::System.Web.UI.HtmlControls.HtmlGenericControl linkUl;

第2版:
好的,我会尽力回答你所有的问题。感谢您的时间和反馈!

  1. 我已重新启动Visual Studio->问题仍然存在
  2. 我还清理了解决方案并部署了一个新的解决方案。->问题仍然存在
  3. 当我调试和检查控制层次结构时,我可以看到标签不在那里
  4. 当我更改ID时,编译器会在代码后面抛出一个错误(这是正确的)。如果我把身份证换成两个,我会得到和以前一样的行为
  5. 我还重新启动了IIS和整个电脑->没有任何更改
  6. 我在链接定义中添加了一个Name属性->没有更改
  7. 当我尝试使用FindControl时,它会返回NULL
  8. 目标框架是.NET 3.5
  9. 链接器不在中继器或任何其他控件内
  10. 删除/更改web.config也不会产生解决方案
  11. 在访问linkUl之前添加EnsureChildControls不会改变任何内容
  12. 将代码移动到Page_PreRender中也不起作用

我会尝试一下你没有在这里列出的建议,并很快添加。

第3版:
这里的完整标记:

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="RTDeluxe.ascx.cs" Inherits="MainSolution.CONTROLTEMPLATES.Kunde.RTDeluxe" %>
<ul id="linkUl" class="teaserLinksUL" runat="server"/>

*第4版:
好的,这里是我发现的一些额外信息:当我更改标记中的某些内容时,比如添加纯html文本,它不会被浏览器识别或显示在浏览器中。当我做这样的事情时:

   Label label1 = new Label();
   label1.Text = "hugo lives!";
   Controls.Add(label1);

如图所示。似乎在视觉工作室里一切都很好。。。但是"活"在服务器上,后面的代码表达了一些奇怪的不同标记。。。

ASP/C#代码隐藏无法从标记中访问控件

这可能会对您有所帮助:

在类级别的用户控件的代码隐藏文件上,添加以下代码:

protected global::System.Web.UI.HtmlControls.HtmlGenericControl linkUl = new System.Web.UI.HtmlControls.HtmlGenericControl();

并从RTDeluxe.ascx.designer.cs文件中删除protected global::System.Web.UI.HtmlControls.HtmlGenericControl linkUl;

这可能是因为它的Object刚刚被声明为未创建。希望这能有所帮助。。

在访问控件或将代码移动到OnPreRender之前,您是否尝试过调用EnsureChildControls

有时在这种情况下,可能只是Visual Studio对此文件的状态不好。我发现删除文件并重新创建它们通常可以解决问题。请确保将代码复制到某个位置,以便将其粘贴回新创建的文件中。

您是否使用visualstudio发布功能进行部署?如果是,请尝试删除目标服务器上的.ascx文件。我让visual studio无法识别文件已更改,然后无法复制新文件。

我以前在.aspx文件中遇到过类似的问题。这是由于在我的web.config文件中将optimizeCompilations设置为true所致。

<system.web>
    <compilation optimizeCompilations="true" />
</system.web>

当optimizeCompilations设置为true时,ASP.Net仅在认为有必要时重建页面。有时它会感到困惑,并且没有意识到您所做的更改需要重新生成页面,从而导致编译器无法捕获的运行时错误。有关此设置的详细信息,请参见此处http://msdn.microsoft.com/en-us/library/ms366723.aspx.

为了解决这个问题,我不得不暂时将optimizeCompilations设置为false,重建我的网站,回收我的应用程序池,然后再次设置为true。

希望这能有所帮助。