Метод Вставки ObjectDataSource объекта
-
12-09-2019 - |
Вопрос
У меня есть 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;
}