Доступ к элементу управления Masterpage на базовой странице с помощью FindControl - PullRequest
1 голос
/ 05 октября 2011

У меня есть веб-приложение ASP.NET на .NET 4.0.Существует одна главная страница, которая содержит верхний и нижний колонтитулы для всех страниц ASPX.Контент поступает с отдельных страниц ASPX.У меня есть BasePage.cs, от которого наследуются все страницы aspx.

Теперь проблема: у меня есть элемент управления HTML Select на главной странице, значение которого я пытаюсь получить в BasePage.cs, используя приведенный ниже код

string language = ((System.Web.UI.HtmlControls.HtmlSelect)Master.FindControl("cmbLanguage")).Value;

Я использую это внутри метода InitializeCulture, который устанавливает информацию о культуре для веб-сайта.

protected override void InitializeCulture()
{

    string language = ((System.Web.UI.HtmlControls.HtmlSelect)Master.FindControl("cmbLanguage")).Value;

    Thread.CurrentThread.CurrentCulture =
        CultureInfo.CreateSpecificCulture(language);
    Thread.CurrentThread.CurrentUICulture = new
        CultureInfo(language);
    base.InitializeCulture();
}

Во время отладки я вижу, что ожидаемое значение установлено впеременная language.Проблема в том, что когда страница отображается, содержимое внутри ContentPlaceHolder для страницы aspx не отображается.

Я вижу, что причиной является код, включающий FindControl, потому что, если я устанавливаю язык в строку, все работает как положено.

string language = "de-DE";

Что ячто-то не так?

ОБНОВЛЕНИЕ: Если в ContentPlaceHolder на MasterPage есть какой-то контент, то он отображается вместо страницы ContentPlaceHolder.

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

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

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

0 голосов
/ 05 октября 2011

Для доступа к элементам управления MasterPage лучше использовать директиву MasterType .При использовании вы сможете получить доступ к главной странице строго типизированным способом.В этом случае вы сможете создать свойство на главной странице следующим образом:

public string SelectedCulture
{
    get
    {
        return cmbLanguage.Value
    }
}

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

protected override void InitializeCulture() {
    string language = this.Master.SelectedCulture;

}
0 голосов
/ 05 октября 2011

Как правильно заметил Doozer, управление вряд ли будет иметь правильное значение, установленное в нем во время InitializeCulture. Я предлагаю вам прочитать значение из данных POST в запросе и вернуть его через какое-то значение по умолчанию. Например,

string language = Request.Form[Master.FindControl("cmbLanguage")).UniqueID];
language = string.IsNullOrWhiteSpace(language) ? "de-DE" : language;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...