2009-06-08 2 views
2

У меня есть объект ObjectDataSource, который я привязываю к элементу управления DetailsView. У меня есть метод вставки, написанный на бизнес-уровне (который вызывает слой данных), и все работает отлично. Пока я не захочу сделать что-то еще до того, как начнется метод вставки. Прежде чем перейти на мой бизнес-уровень, мне нужен доступ к элементу управления файловой загрузкой. Поэтому я подключил событие ItemCommand в DetailsView - он подбирает событие, и я могу делать то, что мне нужно, с помощью элемента управления FileUpload. В этом случае я вызываю метод insert в бизнес-уровне - тот же метод, указанный в элементе управления ObjectDataSource. Но метод Insert срабатывает дважды! Подумав об этом в течение минуты, я понимаю, что это ожидаемое поведение - оно запускается один раз при вызове из события ItemCommand, а во второй раз из ObjectDataSource InsertMethod.ObjectDataSource Вставить метод

Я думал, что я мог бы просто удалить атрибут InsertMethod из ObjectDataSource, чтобы исключить двойной огнь по этому методу, но когда я делаю, что я получаю эту ошибку:

Inserting is not supported by ObjectDataSource 'objStudentDetails' unless the InsertMethod is specified.

Так есть ли способ, что я могу сказать ObjectDataSource не запускать метод? См. Код упрощенного кода ниже:

<asp:DetailsView ID="dtvStudentDetails" 
    runat="server" 
    AutoGenerateRows="False" 
    DataSourceID="objStudentDetails" 
    OnItemCommand="dtvStudentDetails_ItemCommand"> 
    : 
    : 
</asp:DetailsView> 


<asp:ObjectDataSource ID="objStudentDetails" 
    runat="server" 
    TypeName="AIMLibrary.BLL.Students" 
    SelectMethod="GetStudentDetails" 
    UpdateMethod="UpdateStudent">   
    : 
    : 
</asp:ObjectDataSource> 


public static Int32 InsertStudent(Int32 studentId, String firstName, String lastName, String employer, String phone, String email, String address, String city, String state, String zip, String dob, String cardImagePath) 
{ 
    StudentDetails record = new StudentDetails(firstName, lastName, employer, phone, email, address, city, state, zip, dob, cardImagePath); 
    StudentsProvider provider = new StudentsProvider(); 
    return provider.InsertStudent(record); //actual insert happens in here.. 
} 

ответ

5

Есть ли причина, по которой вы не можете просто обрабатывать событие Inserting на объекте ObjectDataSource? У него даже есть способ отменить вставку, если хотите.

Просто добавьте обработчик события к ObjectDataSource в разметке (или использовать конструктор):

<asp:ObjectDataSource id=CustomerObjectDataSource" runat="server" 
    oninserting="CustomerObjectDataSource_Inserting" 
</asp:ObjectDataSource> 

пожары Это событие как раз перед вставкой, и если вам нужно, чтобы остановить его от распространяющегося, вы можете сделать что-то например:

protected void CustomerObjectDataSource_Inserting(object sender, ObjectDataSourceMethodEventArgs e) 
{ 
    InsertMethod(someParams); 

    //If you are satisfied with what has already been done.. 
    e.Cancel = true;  
} 
+0

отлично работает! Не знаю, как я пропустил это - спасибо! – Tone

+0

Ницца проницательность. –

 Смежные вопросы

  • Нет связанных вопросов^_^