#asp.net #page-lifecycle
#asp.net #жизненный цикл страницы
Вопрос:
Я не могу понять, почему моя функция OnPreLoad не запускается для search.aspx.cs.
*Update * — Хорошо, я выяснил, в чем причина проблемы, но я не понимаю, почему это проблема. Я обновил свой вопрос.
Вот три соответствующих файла:
// search.aspx -- THIS <select runat="server"> CAUSED ALL the problem
<select runat="server" id="slctCategories">
<asp:Repeater runat="server" ID="optCategories">
<ItemTemplate>
<option value=""></option>
</ItemTemplate>
</asp:Repeater>
</select>
// search.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
public partial class search : BTPage
{
protected override void OnPreLoad(EventArgs e)
{
base.OnPreLoad(e);
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
// BTPage.aspx.cs - the file that search.aspx.cs inherits from
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
public partial class BTPage : System.Web.UI.Page
{
protected SqlConnection cnx;
protected override void OnPreLoad(EventArgs e)
{
cnx = new SqlConnection(ConfigurationManager.AppSettings["database"]);
cnx.Open();
}
protected override void OnUnload(EventArgs e)
{
cnx.Close();
}
}
Что странно, так это то, что OnUnload ДЕЙСТВИТЕЛЬНО запускается. Что происходит? Почему моя предварительная загрузка не срабатывает?
** ОБНОВЛЕНИЕ ** — У меня сработал onpreload после того, как я изменил его <select runat="server">
на <select>
в своем search.aspx
. Кто-нибудь объяснит мне, почему это устранило проблему? Я часами боролся с этим.
Комментарии:
1. Это странно… Есть причина, по которой вы не используете
DropDownList
?2. Да, я только что наткнулся на asp: выпадающий список сейчас. Я играю с .net всего около 1 дня
Ответ №1:
Может быть что-то странное в том, как вы используете свой select
:
<select runat="server" id="slctCategories">
<asp:Repeater runat="server" ID="optCategories">
<ItemTemplate>
<option value=""></option>
</ItemTemplate>
</asp:Repeater>
</select>
Вы не должны вкладывать Repeater
внутрь этого тега. На самом деле я удивлен, что из-за этого вы не получаете ошибку компиляции / времени выполнения.
Вы заметили, что нашли DropDownList
элемент управления для использования вместо этого. Однако HttpSelectList
элемент управления также имеет аналогичный интерфейс для добавления в него элементов — вам не нужен дополнительный элемент управления списком внутри него.
Я предполагаю, что, поскольку удаление этого в качестве серверного элемента управления устранило проблему (которая устраняет странность синтаксиса), происходит что-то неуловимое, что предотвращает запуск обычной OnPreLoad в этом синтаксисе.
Ответ №2:
В BTPage вы не вызываете base.При предварительной загрузке:
protected override void OnPreLoad(EventArgs e)
{
cnx = new SqlConnection(ConfigurationManager.AppSettings["database"]);
cnx.Open();
}
Я не знаю, почему это помешало бы классу search переопределить метод, хотя, или какое select
это имеет отношение к чему-либо. (например, это должно было сработать в любом случае). Но обычно рекомендуется вызывать базовый метод в любом переопределенном методе (даже в таких, как этот, которые существуют специально для того, чтобы вы могли их переопределять). Вы не знаете, происходит ли в основном Page.OnPreLoad
методе что-нибудь еще, что должно произойти.