Pregunta

Tengo un ObjectDataSource que estoy unión a un control DetailsView. Tengo el método de inserción escrita en una capa de negocio (que llama hacia abajo en una capa de datos) y todo funciona bien .. hasta que yo quiero hacer algo más antes de dispararse el método de inserción. Antes de ir a mi capa de negocio que necesitan tener acceso a un control fileupload. Así que conecté un evento ItemCommand en el DetailsView - que recoge el evento y que puede hacer lo que necesito con el control FileUpload bien. En ese evento que llamo el método de inserción en la capa de negocio - el mismo método especificado en el control ObjectDataSource. Pero los fuegos método Insert dos veces! Después de pensar en esto por un minuto me di cuenta que es el comportamiento esperado - se disparó una vez cuando se llama desde el evento ItemCommand, y la segunda vez desde ObjectDataSource InsertMethod.

pensé que podría simplemente quitar el atributo InsertMethod del ObjectDataSource para eliminar la doble fuego sobre ese método, pero cuando lo hago me sale este error:

  

Inserción no es compatible con   ObjectDataSource '' objStudentDetails   a menos que se especifique el InsertMethod.

Entonces, ¿hay alguna manera de decirle al ObjectDataSource no disparar el método? Ver código de código simplificado a continuación:

<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..
}
¿Fue útil?

Solución

¿Hay alguna razón que no sólo puede controlar el evento Inserción en el ObjectDataSource? Incluso tiene una forma de cancelar la inserción si lo desea.

Sólo tiene que añadir el controlador de eventos al ObjectDataSource en el marcado (o utilizar el diseñador):

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

Este evento se activa justo antes de la inserción, y si tiene que dejar que se propaguen, se puede hacer algo como esto:

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

    //If you are satisfied with what has already been done..
    e.Cancel = true;    
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top