Вопрос об обработке событий asp.net

в чем разница между

<asp:DropDownList ID="Combo" OnSelectedIndexChanged="Change" AutoPostBack="True" runat="server"/>

и

<asp:DropDownList ID="Combo" SelectedIndexChanged="Change" AutoPostBack="True" runat="server"/>

?

И всегда ли требуется атрибут AutoPostBack = "True"?

Я спрашиваю, потому что кажется, что мое событие OnSelectedIndexChanged всегда вызывается дважды (EDIT: когда я использую SelectedIndexChanged, обработчик вообще не вызывается).

Почему это могло быть?

РЕДАКТИРОВАТЬ: это трассировки стека, которые я получаю из события, которое запускается дважды. Последние вроде бы вызываются с какого-то таймера. Я никогда не создавал время, это должно быть какая-то система.

   MyApp!MyNamespace.ListenControl.AuswahlGeändert(object sender = {System.Web.UI.WebControls.DropDownList}, System.EventArgs e = {System.EventArgs}) Zeile 44  C#
    System.Web.dll!System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(System.EventArgs e = {System.EventArgs}) + 0x70 Bytes   
    System.Web.dll!System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent() + 0x87 Bytes  
    System.Web.dll!System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent() + 0xb Bytes    
    System.Web.dll!System.Web.UI.Page.RaiseChangedEvents() + 0xa6 Bytes 
    System.Web.dll!System.Web.UI.Page.ProcessRequestMain(bool includeStagesBeforeAsyncPoint = true, bool includeStagesAfterAsyncPoint = true) + 0x5ce Bytes 
    System.Web.dll!System.Web.UI.Page.ProcessRequest(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint = true) + 0x84 Bytes 
    System.Web.dll!System.Web.UI.Page.ProcessRequest() + 0x51 Bytes 
    System.Web.dll!System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext context) + 0x16 Bytes   
    System.Web.dll!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext context) + 0x32 Bytes   
    App_Web_bm-nkhnz.dll!ASP.kfzpage_aspx.ProcessRequest(System.Web.HttpContext context = {System.Web.HttpContext}) + 0x26 Bytes    C#
    System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0xb6 Bytes 
    System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step = {System.Web.HttpApplication.CallHandlerExecutionStep}, ref bool completedSynchronously = true) + 0x4c Bytes  
    System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception error) + 0x133 Bytes  

    System.Web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData) + 0x7c Bytes  
    System.Web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest wr = {Microsoft.VisualStudio.WebHost.Request}) + 0x17c Bytes  
    System.Web.dll!System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest wr) + 0x63 Bytes  
    System.Web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest wr) + 0x47 Bytes  
    WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Request.Process() + 0x165 Bytes   
    WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Microsoft.VisualStudio.WebHost.Connection conn = {System.Runtime.Remoting.Proxies.__TransparentProxy}) + 0x6c Bytes   
    [Anwendungsdomänenübergang] 
    WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(object acceptedSocket) + 0x7d Bytes 
    mscorlib.dll!System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(object state) + 0x2f Bytes   
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f Bytes    
    mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback tpWaitCallBack) + 0x53 Bytes 
    mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(object state) + 0x59 Bytes    

Это когда событие вызывается второй раз:

MyApp!MyNamespace.ListenControl.AuswahlGeändert(object sender = {System.Web.UI.WebControls.DropDownList}, System.EventArgs e = {System.EventArgs}) Zeile 44 C#
        System.Web.dll!System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(System.EventArgs e = {System.EventArgs}) + 0x70 Bytes   
        System.Web.dll!System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent() + 0x87 Bytes  
        System.Web.dll!System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent() + 0xb Bytes    
        System.Web.dll!System.Web.UI.Page.RaiseChangedEvents() + 0xa6 Bytes 
        System.Web.dll!System.Web.UI.Page.ProcessRequestMain(bool includeStagesBeforeAsyncPoint = true, bool includeStagesAfterAsyncPoint = true) + 0x5ce Bytes 
        System.Web.dll!System.Web.UI.Page.ProcessRequest(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint = true) + 0x84 Bytes 
        System.Web.dll!System.Web.UI.Page.ProcessRequest() + 0x51 Bytes 
        System.Web.dll!System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext context) + 0x16 Bytes   
        System.Web.dll!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext context) + 0x32 Bytes   
        App_Web_bm-nkhnz.dll!ASP.kfzpage_aspx.ProcessRequest(System.Web.HttpContext context = {System.Web.HttpContext}) + 0x26 Bytes    C#
        System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0xb6 Bytes 
        System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step = {System.Web.HttpApplication.CallHandlerExecutionStep}, ref bool completedSynchronously = true) + 0x4c Bytes  
        System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception error) + 0x133 Bytes  

        System.Web.dll!System.Web.HttpApplication.ResumeStepsFromThreadPoolThread(System.Exception error) + 0x25 Bytes  
        System.Web.dll!System.Web.HttpApplication.AsyncEventExecutionStep.ResumeStepsWithAssert(System.Exception error) + 0x28 Bytes    
        System.Web.dll!System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion(System.IAsyncResult ar) + 0x84 Bytes   
        System.Web.dll!System.Web.HttpAsyncResult.Complete(bool synchronous, object result, System.Exception error, System.Web.RequestNotificationStatus status) + 0x3e Bytes   
        System.Web.dll!System.Web.SessionState.SessionStateModule.PollLockedSessionCallback(object state) + 0x169 Bytes 
        mscorlib.dll!System.Threading._TimerCallback.TimerCallback_Context(object state) + 0x2f Bytes   
        mscorlib.dll!System.Threading.ExecutionContext.runTryCode(object userData) + 0x51 Bytes 
        [Übergang von Systemeigen zu Verwaltet] 
        [Übergang von Verwaltet zu Systemeigen] 
        mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x67 Bytes    
        mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x45 Bytes    
        mscorlib.dll!System.Threading._TimerCallback.PerformTimerCallback(object state) + 0x6b Bytes    
        [Anwendungsdomänenübergang] 

person codymanix    schedule 09.03.2010    source источник
comment
Я действительно удивлен, что второй пример работает, потому что Intellisense дает мне только первый.   -  person Greg    schedule 09.03.2010
comment
Теперь я обнаружил, что второй вообще не работает. Нет ошибки, но также не вызывается обработчик событий   -  person codymanix    schedule 09.03.2010


Ответы (3)


в чем разница между [asp: DropDownList 1] и [asp: DropDownList 2]?

SelectedIndexChanged не является допустимым атрибутом для тега asp:DropDownList, поэтому ASP.NET ничего с ним делать не будет.

Я спрашиваю, потому что кажется, что мое событие OnSelectedIndexChanged всегда вызывается дважды ... Почему это могло быть?

Трассировка стека предполагает, что второй вызов события вызван повторно входящим потоком. Вы запускаете какие-либо асинхронные делегаты со своей страницы, используя обратные вызовы клиента или сторонний элемент управления?

person Jeff Sternal    schedule 09.03.2010
comment
Я использую библиотеку microsoft ajax. Я не знаю, как я мог случайно включить асинхронные делегаты или обратные вызовы клиентов, не зная об этом. - person codymanix; 09.03.2010
comment
Спасибо, теперь я нашел это, потому что вы привели меня на правильный путь. Я использую AJAX ListSearchExtender, который вызывает проблему. Теперь вопрос в том, как это исправить .. - person codymanix; 09.03.2010
comment
Ура! Вы уверены, что вам нужно что-то исправить? ListSearchExtender изменяет раскрывающийся список: разве не уместно вызывать OnSelectedIndexChanged, когда он это делает? - person Jeff Sternal; 09.03.2010
comment
Но мне не нужен дважды вызываемый обработчик событий, это просто вызывает ненужный трафик. - person codymanix; 09.03.2010

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

Возможность для события OnSelectedIndexChanged - это проверка, чтобы убедиться, что вы не добавляете обработчик событий дважды. Если он определен в ASPX, то не добавляйте его в программный код и наоборот.

person Stephen Wrighton    schedule 09.03.2010
comment
Со мной такое случалось несколько раз раньше. Убедитесь, что вы не установили ASPX и Codebehind, иначе это может испортить страницу ... и попытаться вызвать его дважды. Вам действительно нужен только один или другой (я предпочитаю код). - person Rob; 09.03.2010
comment
Я отредактировал свой вопрос. Я обнаружил, что это вызывает какой-то таймер обратного вызова, но это не от меня. - person codymanix; 09.03.2010

Если я правильно помню, события с именем OnSomething больше предназначены для внутреннего использования (например, если вы создаете дочерний класс, вы переопределяете OnSelectedIndexChanged). Поэтому я считаю хорошей практикой использовать SelectedIndexChange.

Что касается AutoPostBack, это необходимо для того, чтобы страница была отправлена ​​обратно на сервер при изменении элемента. Если для него не установлено значение true, тогда вы (сервер) никогда не измените его до того, как пользователь нажмет какую-то кнопку отправки или сделает что-то еще, что вызывает автопостэк (на другом элементе управления).

РЕДАКТИРОВАТЬ:

Еще одна вещь, если я не ошибаюсь, метод OnSomething обычно - это тот, который вызывает событие Something (Edit2, похоже, это не относится к языку разметки в Asp.NET (html). OnSomething = " "в html картах на событие Something вроде бы плохо). Итак, если бы вы написали класс «Человек» с именем, которое можно было бы изменить, вы бы сделали это так:

public class Person
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; OnNameChanged(new EventArgs()); }
    }

    protected OnNameChanged(EventArgs args)
    {
        if(NameChanged != null)
            NameChanged(this, args);
    }

    public event EventHandler NameChanged;
}

или что-то вроде того.

Хотя пример Microsoft, вероятно, лучше моего :-P: http://msdn.microsoft.com/en-us/library/5z57dxz2.aspx

person Alxandr    schedule 09.03.2010
comment
Я пробовал без On, только с SelectedIndexChanged, но тогда обработчик вообще не вызывается. Также страница, которую вы даете, посвящена событиям .net в целом, а не тому, как они работают с asp.net. - person codymanix; 09.03.2010
comment
На самом деле вы совершенно правы. msdn.microsoft.com/en- us / library / (что можно сделать с помощью Google). Я забыл, что в языке разметки для Asp.net (другими словами, html) они добавили On перед всем. Так еще называется OnClick ... Моя ошибка. Хотя это все еще звучит странно, что он выстрелил дважды ... Извините, не могу вам помочь. - person Alxandr; 09.03.2010