asp.net При предварительной загрузке не срабатывает?

#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 методе что-нибудь еще, что должно произойти.