2009-06-08 20 views
2

私は、DetailsViewコントロールにバインドするObjectDataSourceを持っています。私はインサートメソッドをビジネスレイヤー(データレイヤーを呼び出す)で作成し、すべて正常に動作します。インサートメソッドが起動する前に何か他の処理を行うまでは、ビジネスレイヤーに行く前に、ファイルアップロードコントロールにアクセスする必要があります。だから、私はDetailsViewのItemCommandイベントを配線しました - それはイベントをピックアップし、私はFileUploadコントロールで必要なものをうまく処理できます。このイベントでは、ビジネスレイヤーのinsertメソッドを呼び出します。これは、ObjectDataSourceコントロールで指定されているのと同じメソッドです。しかし、Insertメソッドは2回発生します!これについて考えた後、これは期待される動作です - ItemCommandイベントから呼び出されると1回、ObjectDataSource InsertMethodから2回目に呼び出されます。ObjectDataSource挿入メソッド

私は単にそのメソッドをダブル火を排除するためにObjectDataSourceからInsertMethod属性を削除することもできますが、私はこのエラーを取得することを行うときに考えた:

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

だから私は言うことができるどのような方法がありますメソッドを起動しないObjectDataSource?以下のコードを簡略化したコードを参照してください。

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

答えて

5

ObjectDataSourceでInsertingイベントを処理できない理由はありますか?必要に応じて挿入をキャンセルする方法もあります。

ただ、マークアップでのObjectDataSourceにイベントハンドラを追加します(またはデザイナを使用):

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

このイベントが発生し、単に挿入する前に、あなたが伝播するからそれを停止する必要がある場合は、あなたが何かを行うことができますこのように:

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

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

素晴らしいです!どのように私はそれを逃したかわからない - ありがとう! – Tone

+0

洞察の素敵なビット。 –