2009-06-08 10 views
2

Ich habe eine ObjectDataSource, die ich an ein DetailsView-Steuerelement binde. Ich habe die Insert-Methode in einer Business-Schicht geschrieben (die in eine Datenebene aufruft) und alles funktioniert gut .. bis ich etwas anderes vor der Einfügemethode tun möchte. Bevor ich zu meiner Business-Schicht gehe, brauche ich Zugriff auf ein Dateiupload-Steuerelement. Also habe ich ein ItemCommand-Ereignis im DetailsView verdrahtet - es nimmt das Ereignis auf und ich kann mit dem FileUpload-Steuerelement genau das tun, was ich brauche. In diesem Fall rufe ich die Einfügemethode in der Business-Schicht auf - dieselbe Methode, die im ObjectDataSource-Steuerelement angegeben ist. Aber die Insert-Methode wird zweimal ausgelöst! Nachdem ich eine Weile darüber nachgedacht habe, merke ich, dass dies das erwartete Verhalten ist - es wird einmal ausgelöst, wenn es vom ItemCommand-Ereignis aufgerufen wird, und das zweite Mal von ObjectDataSource InsertMethod.ObjectDataSource Insert-Methode

Ich dachte, ich einfach das Insert Attribut aus dem Object entfernen könnte das doppelte Feuer an diesem Verfahren zu beseitigen, aber wenn ich tue, dass ich diesen Fehler:

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

So ist es eine Möglichkeit, ich kann sagen, die ObjectDataSource nicht die Methode auslösen? Siehe Code vereinfacht Code unten:

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

Antwort

5

Gibt es einen Grund, warum Sie das Einfügen von Ereignis auf dem Object nicht nur umgehen kann? Es hat sogar eine Möglichkeit, die Einfügung abzubrechen, wenn Sie möchten.

Fügen Sie einfach den Event-Handler auf dem Object in Markup (oder verwenden Sie den Designer):

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

Dieses Ereignis wird ausgelöst, kurz vor dem Einsatz, und wenn Sie es an der Ausbreitung stoppen müssen, können Sie etwas tun wie folgt:

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

    //If you are satisfied with what has already been done.. 
    e.Cancel = true;  
} 
+0

funktioniert super! Nicht sicher, wie ich das verpasst habe - danke! – Tone

+0

Schönes bisschen Einblick. –

Verwandte Themen