Отладка событий GridView / ObjectDataSource

Эй!

Я использую элемент управления ASP.NET GridView, привязанный к ObjectDataSource:

<asp:ObjectDataSource ID="Things" runat="server"
    TypeName="BLL.Thing"
    UpdateMethod="UpdateThing"
    OnUpdating="Things_Updating"
    OnUpdated="Things_Updated">
    <UpdateParameters>
        <asp:SessionParameter
            Name="userContext"
            SessionField="UserContext"
            Type="Object" />
        <asp:Parameter Name="thing" Type="Object" />
    </UpdateParameters>
</asp:ObjectDataSource>

Щелчок по элементу управления ImageButton с CommandName = "Update" вызывает указанное событие OnUpdating, но не указанное событие UpdateMethod или OnUpdated.

<EditItemTemplate>
    <asp:ImageButton ID="ImageButton_Save" runat="server"
        CommandName="Update"
        SkinID="Save"
        CausesValidation="false"
        CommandArgument='<%# Eval("Id") %>' />
    <asp:ImageButton ID="ImageButton_Cancel" runat="server"
        CommandName="Cancel"
        SkinID="Cancel"
        CausesValidation="false" />
</EditItemTemplate>

Входные параметры определяются в событии OnUpdating следующим образом:

protected void Things_Updating(object sender, ObjectDataSourceMethodEventArgs e)
{
    e.InputParameters["thing"] = _theThing;
}

Исключение не создается. Страница просто отправляется обратно, а элементы управления EditItemTemplate все еще отображаются. Я могу ставить точки останова повсюду, но след останавливается в конце Things_Updating. Похоже, что происходит какое-то исключение, которое не обрабатывается или не перехватывается отладчиком. Есть ли способ открыть капот и посмотреть, что делает (или не делает) ASP.NET?

Заранее спасибо!


person Adam    schedule 19.12.2011    source источник


Ответы (2)


BLL.Thing.UpdateThing() выполняется? Это должно произойти после Things.Updating и легко поддается отладке. Также, если есть что-то, вызывающее исключение, вероятно, это так.

Редактировать:

Попробуйте добавить параметр в обработчик для GridView.RowUpdating вместо ObjectDataSource.Updating. Вот как я обычно это делаю. Я думаю, вам нужно получить DataSourceView, чтобы изменить параметры обновления в событии ObjectDataSource. (См .: ObjectDataSource Gridview Insert Fails W / Empty Values ​​Dictionary )

protected void gridThings_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    e.NewValues.Add("thing", _theThing);
}
person pseudocoder    schedule 19.12.2011
comment
Нет, след таинственным образом заканчивается после Things_Updating: - / - person Adam; 20.12.2011
comment
Я не думаю, что у класса GridView есть событие OnUpdating, но у него есть событие RowCommand, которое я буду использовать вместо этого. Спасибо! - person Adam; 21.12.2011
comment
@ Адам Моя ошибка, я хотел сослаться на GridView.RowUpdating. Спасибо за согласие! - person pseudocoder; 21.12.2011

На ум приходят две вещи, которые могут сразу остановить прогресс:

  1. Вы также обработали событие GridView.RowUpdating и установили для свойства GridViewUpdateEventArgs.Cancel значение true. Что-то вроде этого:

    protected void myGridView_RowUpdating(Object sender, GridViewUpdateEventArgs e)
    {
        e.Cancel = true;
    }
    
  2. Вы сделали нечто подобное в событии ObjectDataSource.Updating, установив для свойства ObjectDataSourceMethodEventArgs.Cancel значение false. Нравится:

    private void myObjectDataSource_Updating(object source, ObjectDataSourceMethodEventArgs e)
    {
        e.Cancel = true;
    }
    

Любой из них остановит процесс обновления, что приведет к тому, что вы описываете.

person Josh Darnell    schedule 20.12.2011
comment
Спасибо, партнер. У меня есть условная логика, которая при определенных обстоятельствах устанавливает для e.Cancel значение true, но они не выполняются. Я собираюсь отказаться от этого подхода и вместо этого использовать свой собственный метод в событии RowCommand. - person Adam; 21.12.2011
comment
@ Адам Ну, стреляй! Удачи тебе тогда =) - person Josh Darnell; 21.12.2011