2016-09-16 9 views
0

В моем приложении ASP.NET - с включенным ViewState - я могу сбросить ввод, просто установив их снова. Вот основной простой пример, который работает:ViewState перезаписывает изменения динамически добавленного UserControl (в Placeholder) на PostBack

_TEST.aspx

<asp:ScriptManager runat="server" />   
<asp:DropDownList ID="ddl" runat="server" DataSource='<%# new string[] { "A", "B", "C" } %>' /> 
<asp:Button ID="b" runat="server" UseSubmitBehavior="false" OnClick="b_Click" Text="Test 1" /> 

_TEST.aspx.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.DataBind(); 
    this.ddl.SelectedValue = "B"; 
} 

protected void b_Click(object sender, EventArgs e) 
{ 
    Console.WriteLine("Updated"); 
} 

В этом примере ddl будет связан с "А" , «B» и «C» на Page_Load, и он всегда будет выбирать «B». Поэтому, когда вы меняете выбор и отправляете, он будет сброшен. Представьте, что это используется для сброса некоторых элементов управления в определенных условиях.


В моем случае мне нужен этот вид поведения на динамически загружаемой UserControl, который добавляется к Placeholder. Потому что Placeholder не сохраняет содержимое, необходимое для воссоздания элементов управления при каждой обратной передаче. ViewState, похоже, в порядке с ним. Вот пример:

_TEST.aspx

<asp:ScriptManager runat="server" /> 
<asp:PlaceHolder ID="ph" runat="server" /> 

_TEST.aspx.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    _TESTUC uc = (_TESTUC)this.Page.LoadControl("~/Controls/_TESTUC.ascx"); 
    this.ph.Controls.Add(uc); 
} 

_TESTUC.ascx

<asp:DropDownList ID="ddl" runat="server" DataSource='<%# new string[] { "A", "B", "C" } %>' /> 
<asp:Button ID="b" runat="server" UseSubmitBehavior="false" OnClick="b_Click" Text="Test 2" /> 

_TESTUC.ascx.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.DataBind(); 
    this.ddl.SelectedValue = "B"; 
} 

protected void b_Click(object sender, EventArgs e) 
{ 
    Console.WriteLine("Updated"); 
} 

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

Что можно сделать, чтобы исправить это?

ответ

0

При написании этого вопроса я пришел к решению, но решил опубликовать его для других народов, так или иначе.

кажется ASP.NET загрузит ViewState между Page_Init и Page_Load в контрольной группе, которые определены в ASPX, в то время как он загружает ViewState между Page_Load и Page_LoadComplete в контролях, которые загружаются в фоновом коде.

Установка значений в Page_LoadComplete решает эту проблему:

protected void Page_Init(object sender, EventArgs e) 
{ 
    this.Page.LoadComplete += new EventHandler(this.Page_LoadComplete); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.DataBind(); 
} 

protected void Page_LoadComplete(object sender, EventArgs e) 
{ 
    this.ddl.SelectedValue = "B"; 
} 

protected void b_Click(object sender, EventArgs e) 
{ 
    Console.WriteLine("Updated"); 
}