后面的ASP / C#代码无法通过标记达到控制

时间:2012-01-09 13:53:24

标签: c# asp.net sharepoint-2010 controltemplates

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

<%@ 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文件具有相同的结构 - &gt;他们的工作就像一个魅力。

问题:
这种行为的名称空间还有其他原因吗?你有任何我可以看到的提示吗?

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

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

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

  1. 我已重新启动Visual Studio - &gt;问题仍然存在。
  2. 我也清理了解决方案并部署了一个新解决方案。 - &GT;问题依然存在。
  3. 当我调试并检查控件层次时,我可以看到标签不在那里。
  4. 当我更改ID时,编译器会在代码隐藏中抛出错误(这是正确的)。如果我更改了ID,我会得到与之前相同的行为。
  5. 我还重启了我的IIS和整个电脑 - &gt;没有变化。
  6. 我在linkul-definition中添加了Name属性 - &gt;没有变化。
  7. 当我尝试使用FindControl时,它返回NULL。
  8. 目标框架是.NET 3.5
  9. linkul不在转发器或任何其他控件内。
  10. 删除/更改web.config也不会产生解决方案。
  11. 在访问EnsureChildControls之前添加linkUl并不会改变任何内容。
  12. 将代码移至Page_PreRender也无效。
  13. 我会尝试您未在此处列出的建议,并尽快添加。

    EDIT3:
    这里是完整的标记:

    <%@ 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"/>
    

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

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

    显示。在视觉工作室中似乎一切都很好......但是在服务器上“活”,代码隐藏会对一些奇怪的不同标记说话......

5 个答案:

答案 0 :(得分:1)

这可能对你有所帮助:

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我之前在.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。

希望这有帮助。

答案 3 :(得分:0)

有时候在这种情况下,可能只是因为Visual Studio在这个文件方面陷入了糟糕的状态。我发现删除文件并重新创建它们通常可以解决问题。确保将代码复制到某处,以便将其粘贴回新创建的文件中。

答案 4 :(得分:0)

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