Pergunta

Eu tenho um ObjectDataSource que eu estou ligação a um controle DetailsView. Eu tenho o método de inserção escrito em uma camada de negócios (que chama para baixo em uma camada de dados) e tudo funciona bem .. até que eu quero fazer outra coisa antes dos incêndios método de inserção. Antes de ir para a minha camada de negócios que precisam de acesso a um controle fileupload. Então eu cabeada um evento ItemCommand na DetailsView - ele pega o evento e posso fazer o que eu preciso com o controle FileUpload muito bem. Nesse caso eu chamo o método de inserção na camada de negócios - o mesmo método especificado no controle ObjectDataSource. Mas os incêndios método Insert duas vezes! Depois de pensar sobre isso por um minuto eu perceber que este é o comportamento esperado - é acionado uma vez quando chamado a partir do evento ItemCommand, ea segunda vez de ObjectDataSource InsertMethod.

Eu pensei que eu poderia simplesmente remover o atributo InsertMethod do ObjectDataSource para eliminar o fogo duas vezes sobre esse método, mas quando eu faço que eu recebo este erro:

Inserir não é suportado pelo 'ObjStudentDetails' ObjectDataSource a menos que o InsertMethod é especificado.

Então, há alguma maneira que eu posso dizer a ObjectDataSource não para disparar o método? Ver código simplificado código abaixo:

<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..
}
Foi útil?

Solução

Existe uma razão que você não pode apenas manipular o evento Inserção no ObjectDataSource? Ele ainda tem uma maneira de cancelar a inserção, se quiser.

Basta adicionar o manipulador de eventos para o ObjectDataSource na marcação (ou use o designer):

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

Este evento é acionado imediatamente antes da inserção, e se você precisa parar de propagação, você pode fazer algo como isto:

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

    //If you are satisfied with what has already been done..
    e.Cancel = true;    
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top