Вопрос

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

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

Вставка не поддерживается ObjectDataSource 'objStudentDetails' если не указан InsertMethod.

Итак, есть ли какой-нибудь способ, которым я могу сообщить 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..
}
Это было полезно?

Решение

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

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

<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;    
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top