2009-06-08 3 views
2

J'ai une ObjectDataSource que je lie à un contrôle DetailsView. J'ai la méthode d'insertion écrite dans une couche de gestion (qui appelle dans une couche de données) et tout fonctionne bien .. jusqu'à ce que je veux faire quelque chose d'autre avant que la méthode d'insertion se déclenche. Avant de passer à ma couche de gestion j'ai besoin d'accéder à un contrôle fileupload. J'ai donc câblé un événement ItemCommand sur DetailsView - il récupère l'événement et je peux faire ce dont j'ai besoin avec le contrôle FileUpload. Dans ce cas, j'appelle la méthode insert dans la couche de gestion - la même méthode que celle spécifiée dans le contrôle ObjectDataSource. Mais la méthode Insert se déclenche deux fois! Après y avoir réfléchi un instant, je réalise que c'est le comportement attendu - il est déclenché une fois lorsqu'il est appelé depuis l'événement ItemCommand, et la seconde fois depuis ObjectDataSource InsertMethod.ObjectDataSource Méthode d'insertion

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:

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

Ainsi est-il possible que je peux dire ObjectDataSource ne déclenche pas la méthode? Voir code code simplifié ci-dessous:

<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.. 
} 

Répondre

5

Y a-t-il une raison pour laquelle vous ne pouvez pas simplement gérer l'événement Inserting sur ObjectDataSource? Il a même un moyen d'annuler l'insertion si vous le souhaitez.

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;  
} 
+0

fonctionne très bien! Je ne sais pas comment j'ai raté ça - merci! – Tone

+0

Un bon aperçu. –

Questions connexes