Код ASP / C # не может получить контроль над разметкой - PullRequest
6 голосов
/ 09 января 2012

Проблема:
У меня есть разметка, как это (только важные строки):

<%@ 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 НЕДЕЙСТВИТЕЛЕН.

Сначала я подумал, что пространства имен являются причиной. Но после нескольких попыток я уверен, что они правы. FileLocation кажется правильным, и в папке controltemplates моего iis есть папка "Kunde" с соответствующими файлами ascx.

У меня есть другие файлы .ascx с такой же структурой -> они работают как шарм.

Вопрос:
Есть ли другие причины, кроме пространства имен для такого поведения? У вас есть какие-нибудь подсказки, где я могу посмотреть?

Edit:
Файл RTDeluxe.ascx.designer.cs существует, сгенерированный linkUl выглядит так:

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

Edit2:
Хорошо, я постараюсь ответить на все ваши вопросы. Спасибо за ваше время и обратную связь!

  1. Я перезапустил Visual Studio -> Проблема не устранена.
  2. Я также очистил решение и развернул новое. -> Проблема сохраняется.
  3. Когда я отлаживаю и проверяю иерархию управления, я вижу, что там нет метки.
  4. Когда я меняю идентификатор, компилятор выдает ошибку в коде (что верно). Если я поменяю ID, то получу то же поведение, что и раньше.
  5. Я также перезапустил свой IIS и весь компьютер -> Без изменений.
  6. Я добавил атрибут Name в определение linkul -> Без изменений.
  7. Когда я пытаюсь использовать FindControl, возвращается NULL.
  8. Целевой платформой является .NET 3.5
  9. Linkul НЕ находится внутри ретранслятора или каких-либо других элементов управления.
  10. Удаление / изменение файла web.config также не приводит к решению.
  11. Добавление EnsureChildControls перед доступом к linkUl ничего не меняет.
  12. Перемещение кода в Page_PreRender также не работает.

Я опробую ваши предложения, не перечисленные здесь, и скоро добавлю их.

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);

Показано. Кажется, что в Visual Studio все хорошо ... Но "живой" на сервере код позади говорит с какой-то странной разметкой ...

Ответы [ 5 ]

1 голос
/ 31 января 2012

Это может немного помочь Вам:

В файле с выделенным кодом пользовательского элемента управления на уровне класса добавьте этот код:

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 file

Это может быть потому, что его Объект был объявлен как не созданный.Надеюсь, это поможет ..

0 голосов
/ 11 января 2012

Развертываете ли вы, используя функцию публикации Visual Studio? Если это так, попробуйте удалить файл .ascx на конечном сервере. У меня была Visual Studio, которая не распознает, что файл изменился, и не копирует новый файл.

0 голосов
/ 10 января 2012

У меня была проблема, похожая на эту, в файле .aspx. Это было вызвано тем, что для optimizeCompilations установлено значение true в моем файле web.config.

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

Когда для optimizeCompilations установлено значение true, ASP.Net перестраивает страницы только тогда, когда считает это необходимым. Иногда это сбивает с толку и не осознает, что вы внесли изменение, которое требует перестроения страницы, что приводит к ошибке времени выполнения, которую компилятор не улавливает. Смотрите здесь для получения дополнительной информации об этой настройке http://msdn.microsoft.com/en-us/library/ms366723.aspx.

Чтобы решить эту проблему, мне пришлось временно установить для optimizeCompilations значение false, перестроить свой веб-сайт, перезапустить пул приложений, а затем снова установить для него значение true.

Надеюсь, это поможет.

0 голосов
/ 11 января 2012

Иногда в таких ситуациях может случиться так, что Visual Studio попал в плохое состояние по отношению к этому файлу.Я обнаружил, что удаление файлов и их воссоздание часто решают проблему.Обязательно скопируйте код куда-нибудь, чтобы вы могли вставить его обратно во вновь созданные файлы.

0 голосов
/ 09 января 2012

Вы пытались позвонить EnsureChildControls перед доступом к элементу управления или перемещением кода в OnPreRender?

...