2011-01-04 4 views
1

У меня есть кнопка на главной странице, которая при нажатии вызывает метод, который принимает ранее сохраненный EventNandler в viewstate, этот метод находится на клиентской странице и выполняет его:Обработчик событий на главной странице, доступ к элементам управления на странице клиента

protected void Save_Click(object sender, EventArgs e) 
    { 

     this.SaveButtonEvent += (EventHandler)ViewState["saveEvent"]; 
     if (this.SaveButtonEvent != null) 
     { 
      this.SaveButtonEvent(sender, e); 

     } 

    } 

Это затем вызывает очень простой метод на странице клиента:

protected void Button2_Click(object sender, EventArgs e) 
{ 

    Label1.Text = TextBox2.Text; 
} 

Однако значение TextBox2 неверно, это значение текстового поля, который был установлен, когда страница загружена (или если какой-либо другой элемент на страницах меняет его), новое значение не будет передано.

Если я добавляю кнопку на клиентскую страницу, которая вызывает событие Button2_Click напрямую, она получает правильное значение.

Является ли причина, по которой я не получаю правильное значение текстового поля, потому что событие вызывается с главной страницы? Любые решения?

Я должен добавить, что эта кнопка создается динамически, и делегат события будет меняться, поэтому я должен установить его во время выполнения. Мне нужно установить делегат на клик и сохранить его до тех пор, пока он не будет изменен.

ответ

1

Нет, причина в том, что вы сохранили делегат в viewstate.

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

+0

Ах, это имеет смысл (хотя я пытался сохранить его в сессии тоже, с тем же результат) можете ли вы предложить, где я могу хранить его между postbacks? –

+0

@Sam: вы не можете сохранять объекты управления между postbacks, они должны быть созданы для объекта страницы, где они будут использоваться. Даже если бы это было возможно, это было бы бесполезно, поскольку на текущей странице не было контроля, поэтому их изменение не имело бы видимого эффекта. Вы должны получить доступ к элементам управления, которые находятся в текущем объекте страницы. Направьте ссылку 'Page' на фактический класс страницы, чтобы вы могли получить доступ к ее членам, например:' ((TheClientPage) Страница) .Label1.Text'. – Guffa

+0

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

1

Можете ли вы вместо этого выставить событие с главной страницы, которое можно обрабатывать на странице контента?

Мастер-страница:

public event EventHandler<EventArgs> AfterSave; 
protected void Save_Click(object sender, EventArgs e) 
{ 
    if(AfterSave != null) AfterSave(this, EventArgs.Empty); 
} 

Содержимое страницы:

protected void Page_Load(object sender, EventArgs e) 
{ 
    MasterPageObject m = (MasterPageObject)base.Master; 
    m.AfterSave += onMasterSave; 
} 
private void onMasterSave(object sender, EventArgs e) 
{ 
    // Your processing here 
} 

- Павел

Смежные вопросы