Как назначить значение элемента базовой страницы из Page_Load дочерней страницы? - PullRequest
0 голосов
/ 09 ноября 2011

Я, наверное, не первый, у кого есть эта проблема, но я не могу найти такой вопрос и решение для него.

У меня есть базовая страница ASPX и дочерняя страница, которая наследуется от базовой страницы. Из дочернего Page_Load метода я вызываю метод на базовой странице, такой как base.SetLiteral(value), который принимает литерал, определенный на базовой странице. Я получаю исключение NullReferenceException, поскольку литерал равен нулю.

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

Как я могу это сделать?

EDIT

Вот трассировка стека исключения. Ничего не говорит мне.

System.NullReferenceException was unhandled by user code
Message=Object reference not set to an instance of an object.
Source=PageInheritance
StackTrace:
   at PageInheritance.BasePage.SetLiteral(String value) in D:\crap-projects\PageInheritance\BasePage.aspx.cs:line 17
   at PageInheritance.Page1.Page_Load(Object sender, EventArgs e) in D:\crap-projects\PageInheritance\Page1.aspx.cs:line 13
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:  

Ответы [ 4 ]

1 голос
/ 09 ноября 2011

Хорошо, похоже, что когда кто-то наследует страницу .aspx, это только тот код, который наследуется. Разметка (сама по себе .aspx) не наследуется, и нет способа (как ContentPlaceHolder на главной странице) определить, какие элементы (из производной, базовой страницы или обоих) нужно разместить на странице результатов.

Поскольку базовая страница .aspx не наследуется, никакие элементы управления, добавленные в конструктор, никогда не инициализируются. Я не очень понимаю, как это работает (хотя Page_Init называется, но как страница решает не инициализировать свои элементы управления, это загадка) Кто-нибудь может объяснить это немного?

Мне, вероятно, придется использовать главную страницу для достижения своей цели, но я продолжу свое исследование и обновлю свой вопрос.

Если я где-то ошибаюсь, пожалуйста, дайте мне знать.

EDIT

Да, я достиг того, что мне нужно было сделать, используя главную страницу вместо наследования страницы .aspx. Там не было никаких проблем.

приписка

Я нашел способ унаследовать страницу .aspx с разметкой на базовой странице здесь: http://www.codeproject.com/KB/aspnet/page_templates.aspx но для меня это выглядит как полная хакерская атака.

1 голос
/ 09 ноября 2011

Вы правы, это произойдет, если элемент управления базовыми страницами не инициализирован.

Взгляните на Обзор жизненного цикла страницы ASP.NET - события жизненного цикла , если вы этого еще не сделали. Как вы можете видеть, он должен работать в Page_Load, и я не вижу, в чем проблема. Попробуйте переместить событие в событие позже в жизненном цикле страницы, например, в событие LoadComplete .

0 голосов
/ 09 ноября 2011

Что-то тут не так, но в таком случае вы можете попробовать создать обработчик событий на базовой странице, который срабатывает после инициализации элементов управления:

На базовой странице:

public event EventHandler BasePageInitialized;

protected void Page_Load(object sender, EventArgs e)
{
    if (this.BasePageInitialized != null)
        this.BasePageInitialized(this, e);
}

На дочерней странице:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
        base.BasePageInitialized += new EventHandler(Base_Initialized);
}

protected void Base_Initialized(object sender, EventArgs e)
{
    base.SetLiteral(value)
}
0 голосов
/ 09 ноября 2011

Я не уверен, может ли это быть применимо к вашей проблеме, но вы можете создать класс, и обе страницы будут наследоваться от одного класса, который, в свою очередь, будет наследовать от базового System.Web.UI.Page. Вы можете разместить общий метод в новом классе, и он будет доступен с обеих страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...