Управление сервером ASPNET WebForms равно NULL в Page_Load - программирование
Подтвердить что ты не робот

Управление сервером ASPNET WebForms равно NULL в Page_Load

У меня очень странная ситуация, когда мой элемент управления Label равен NULL в Page_Load. Должно ли это быть возможно?

У меня есть веб-форма:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="MyNamespace.Templates.Pages.WebForm1" %>
<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div style="background-color:yellowgreen;">
        FIRST
    </div>
    <div style="background-color: wheat;">
        SECOND
        <cw:ArticleColumn runat="server" ID="ac" ArticleID="1899"/>
    </div>
    </form>
</body>
</html>

В Page_Load веб-формы я просто делаю

if(!IsPostBack) DataBind();

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

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ArticleColumn.ascx.cs"  Inherits="MyNamespace.Templates.Units.ArticleColumn" %>
<h2><asp:Label runat="server" ID="myArticleHeading" Text="TOM" /></h2>
<p><asp:Label runat="server" ID="myArticleIntro" Text="TOM" /></p>
<asp:Label runat="server" ID="myArticleBody" Text="TOM" />

И код выглядит так:

public partial class ArticleColumn : UserControlBase<PageTypes.ArticleBase>
{
    public int ArticleID { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        var page = DataFactory.Instance.GetPage(new PageReference(ArticleID));

        myArticleHeading.Text = page.PageName;
        myArticleIntro.Text = page.Property["IntroText"] != null
                            ? page.Property["IntroText"].ToWebString()
                            : string.Empty;
        myArticleBody.Text = page.Property["MainBody"] != null
                            ? page.Property["MainBody"].ToWebString()
                            : string.Empty;

        DataBind();
    }
}

Он терпит неудачу, когда я пытаюсь установить myArticleHeading.Text, потому что элемент управления имеет значение null. Как это вообще возможно? Автоматическое связывание элементов управления ASP.NET должно каким-то образом сбой...

Я пробовал: - Перезапуск VS 2010 - Переключение конфигураций сборки - Очистка/Восстановление - Изменение имен элементов управления для обновления файла конструктора.

Излишне говорить, что ничего из этого не было.

Изменить: добавлена ​​трассировка стека:

[NullReferenceException: Object reference not set to an instance of an object.]
   MyNamespace.Templates.Units.ArticleColumn.Page_Load(Object sender, EventArgs e) in C:\DevProjects\CustomerWeb\Main\Source\MyNamespace\Templates\Units\ArticleColumn.ascx.cs:21
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
   System.Web.UI.Control.OnLoad(EventArgs e) +91
   System.Web.UI.Control.LoadRecursive() +74
   System.Web.UI.Control.LoadRecursive() +146
   System.Web.UI.Control.LoadRecursive() +146
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207

Решение: Я сам нашел ответ. Использование этого объявления для usercontrol на странице устраняет проблему:

<%@ Register TagPrefix="cw" TagName="ArticleColumn" Src="~/Templates/Units/ArticleColumn.ascx" %>

Это ошибочное объявление было добавлено с помощью меню правой кнопки мыши ReSharper из представления html:

<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %>

Спасибо за помощь!:)

4b9b3361

Ответ 1

Я ответил на свой вопрос выше.

Решение: я просто нашел ответ сам. Использование этого объявления для usercontrol на странице устраняет проблему:

<%@ Register TagPrefix="cw" TagName="ArticleColumn" Src="~/Templates/Units/ArticleColumn.ascx" %>

Это ошибочное объявление было добавлено с помощью меню правой кнопки мыши ReSharper из представления html:

<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %>

Спасибо за помощь!:)

Ответ 2

DataBind - это что-то для привязки элементов управления, написанных в части aspx, со стороны сервера script ie <%% > .

Но ваш сценарий не требует вызова databind(). Простое назначение значений элементам управления должно работать нормально.

Попробуйте удалить данные из вашего кода.

Ответ 3

Обновите содержимое пользовательского элемента управления со страницы.

Объявить свойства в пользовательском элементе управления для обновления содержимого меток и использовать эти свойства со страницы с экземпляром пользовательского элемента управления.