ASP/C# code behind can not reach control from markup

时光怂恿深爱的人放手 提交于 2019-12-07 03:11:58

问题


Issue:
I have a markup like this (only the important lines):

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

The code-behind:

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

I can access the ul inside the code-behind and get no compilation error. But, when I debug the code I get a NullReferenceException because linkUl is NULL.

First I thought that the namespaces are the reason. But, after several tries, I'm sure that they're correct. The FileLocation seems to be correct and the controltemplates folder of my iis has a "Kunde" folder with the corresponding ascx files in it.

I have other .ascx files with the same structure -> they're working like a charm.

Question:
Are there any other reasons than the namespace for such behaviour? Do you have any hints where I can look at?

Edit:
The RTDeluxe.ascx.designer.cs file exists, the generated linkUl looks like this:

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

Edit2:
Ok, I will try to answer all your questions. Thanks for your time and feedback!

  1. I have restarted Visual Studio -> The Problem persists.
  2. I also have cleaned up the solution and deployed a new one. -> The problem persists.
  3. When I debug and check the control hierachy I can see that the label is NOT there.
  4. When I change the ID the compiler throws an error in the code-behind (which is right). If i change the ID there two I get the same behavoiur as before.
  5. I also restarted my IIS and the whole pc -> No changes.
  6. I have added a Name attribute to the linkul-definition -> No changes.
  7. When I try to use FindControl it returns NULL.
  8. The target-framework is .NET 3.5
  9. The linkul is NOT inside a repeater or any other controls.
  10. Removing/changing the web.config does also not lead to a solution.
  11. Adding EnsureChildControls before accessing the linkUl doesnt change anything.
  12. Moving the code into Page_PreRender does also not work.

I will try out your suggestions not listed here and add them soon.

Edit3:
Here the full markup:

<%@ 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:
Ok here some additional info I found out: When I change something in the markup, like adding plain html text it's NOT recognized by or shown in the browser. When i do something like this:

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

It is shown. It seems like in visual studio everything is fine... But "live" at the server the code-behind speaks to some weird different markup...


回答1:


This might help You a bit:

On the code-behind file of the user-control at class level, add this code:

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

and remove the protected global::System.Web.UI.HtmlControls.HtmlGenericControl linkUl; from RTDeluxe.ascx.designer.cs file

It might be because its Object was just declared not created. Hope this helps..




回答2:


Have you tried calling EnsureChildControls before accessing the control or moving the code into OnPreRender?




回答3:


Sometimes in situations such as this it may just be that Visual Studio has got into a bad state with regard to this file. I have found that deleting the files and recreating them will often resolve the issue. Make sure to copy the code somewhere so that you can paste it back into the newly created files.




回答4:


Are you deploying using the visual studio publish functionality? If so, try deleting the .ascx file on your destination server. I have had visual studio not recognize that the file has changed and then doesn't copy the new file over.




回答5:


I've had a problem similar to this before in an .aspx file. It was caused by having optimizeCompilations set to true in my web.config file.

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

When optimizeCompilations is set to true ASP.Net only rebuilds pages when it feels it is necessary. Sometimes it gets confused and doesn't realize you've made a change that needs a page rebuild resulting in a run-time error that the compiler doesn't catch. See here for more information about this setting http://msdn.microsoft.com/en-us/library/ms366723.aspx.

To fix the problem I had to temporarily set optimizeCompilations to false, rebuild my website, recycle my app pool, and then set it back to true again.

Hope this helps.



来源:https://stackoverflow.com/questions/8789441/asp-c-code-behind-can-not-reach-control-from-markup

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!