Question

J'ai un ObjectDataSource que je suis lier à un contrôle DetailsView. J'ai la méthode d'insertion écrit dans une couche d'affaires (qui appelle en une couche de données) et tout fonctionne très bien .. jusqu'à ce que je veux faire quelque chose d'autre avant le déclenchement de la méthode d'insertion. Avant d'aller à ma couche d'affaires que je besoin d'accéder à un contrôle FileUpload. Donc, je câblé un événement ItemCommand sur le DetailsView - il prend l'événement et je peux faire ce que je dois avec le contrôle FileUpload très bien. Dans ce cas, j'appelle la méthode d'insertion dans la couche d'affaires - la même méthode indiquée dans le contrôle ObjectDataSource. Mais les feux de la méthode Insérer deux fois! Après avoir réfléchi à ce sujet pour une minute, je sais que c'est le comportement attendu - il est tiré une fois quand appelé de l'événement ItemCommand, et la deuxième fois de ObjectDataSource InsertMethod.

Je pensais que je pourrais simplement supprimer l'attribut InsertMethod du ObjectDataSource pour éliminer la double feu sur cette méthode, mais quand je fais ce que je reçois cette erreur:

  

insertion est pas pris en charge par   ObjectDataSource 'objStudentDetails'   sauf si spécifié est le InsertMethod.

est-il possible que je peux dire au ObjectDataSource de ne pas tirer la méthode? Voir ci-dessous le code simplifié de code:

<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..
}
Était-ce utile?

La solution

Y at-il une raison que vous ne pouvez pas gérer l'événement sur le ObjectDataSource Insertion? Il a même un moyen d'annuler l'insertion si vous voulez.

Il suffit d'ajouter le gestionnaire d'événements au ObjectDataSource dans le balisage (ou utilisez le concepteur):

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

Cet événement se déclenche juste avant l'insertion, et si vous devez arrêter de se propager, vous pouvez faire quelque chose comme ceci:

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

    //If you are satisfied with what has already been done..
    e.Cancel = true;    
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top