2013-11-01 6 views
1

Передача сервера с помощью preserveForm true в EventHandler подтверждает этот обработчик события и вызывает бесконечный цикл. МОЙ ВОПРОС: Как я могу указать в обработчике, что событие было обработано.Передача сервера с помощью preserveForm true в EventHandler подтверждает это событие Обработчик

PS: Я знаю, что мы можем установить для параметра preserveForm значение false, но я не хочу этого делать.

Пример кода:

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Server.Transfer(Request.FilePath, true); 
} 

ответ

0

Большой вопрос, который я столкнулся прямо сейчас. Я тоже не знаю ответа, я бы предположил, что он изменит данные Request.Form, чтобы удалить событие, хотя я не уверен, как это сделать.

В качестве обходного пути я использую флаг охраны в Context.Items, который также сохраняется.

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (IsSecondPass()) return; 
    Server.Transfer(Request.FilePath, true); 
} 

private bool IsSecondPass() 
{ 
    const string key = "SECOND_PASS_GUARD"; 
    if (Context.Items[key] == null) 
    { 
     Context.Items[key] = new object(); 
     return false; 
    } 
    else 
    { 
     Context.Items.Remove(key); 
     return true; 
    } 
} 

Я бы не рекомендовал это, но он работает. (Название метод также очень плохо выбирают потому, что побочные эффекты.)

Там также более короткий путь:

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (PreviousPage != null) return; 
    Server.Transfer(Request.FilePath, true); 
} 

Имейте ввиду, что он не имеет каких-либо нежелательных эффектов, если вы делаете другие виды кросс- (хотя я не знаю, почему и как вы перекрестите событие SelectedIndexChanged с другой страницы). Все еще не рекомендуется.

Примечание: Если вы кодируете основную страницу, вам необходимо указать PreviousPage из свойства Page на класс главной страницы (Page.PreviousPage).