Domanda

Ho un ObjectDataSource che sto legame a un controllo DetailsView. Ho il metodo di inserimento scritto in uno strato di business (che chiama in giù in uno strato di dati) e tutto funziona bene .. fino a quando voglio fare qualcos'altro prima i fuochi metodo di inserimento. Prima di andare al mio livello di business ho bisogno di accesso a un controllo FileUpload. Così ho cablato un evento ItemCommand sul DetailsView - raccoglie l'evento e posso fare quello che mi serve con il controllo FileUpload bene. In tal caso chiamo il metodo di inserimento nel livello di business - lo stesso metodo indicato nel controllo ObjectDataSource. Ma il metodo Insert incendi due volte! Dopo aver pensato a questo per un minuto mi rendo conto che questo è il comportamento previsto - è sparato una volta quando viene chiamato dall'evento ItemCommand, e la seconda volta da ObjectDataSource InsertMethod.

Ho pensato che avrei potuto semplicemente rimuovere l'attributo InsertMethod dal ObjectDataSource per eliminare il doppio fuoco su quel metodo, ma quando lo faccio che ottengo questo errore:

  

Inserimento non è supportato da   ObjectDataSource 'objStudentDetails'   a meno che non sia specificato l'InsertMethod.

Quindi non v'è un modo per dire al ObjectDataSource non sparare il metodo? Vedere codice semplificato di seguito:

<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..
}
È stato utile?

Soluzione

C'è un motivo non si può semplicemente gestire l'evento Inserimento sulla ObjectDataSource? Dispone anche di un modo per annullare l'inserto se si desidera.

Basta aggiungere il gestore di eventi al ObjectDataSource nel markup (o usare il progettista):

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

Questo evento si attiva subito prima l'inserto, e se avete bisogno di fermarlo da moltiplicazione, si può fare qualcosa di simile:

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

    //If you are satisfied with what has already been done..
    e.Cancel = true;    
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top