2010-11-27 15 views
0

Ich habe ein Problem mit meinem delete-Parameter. Ich verwende eine GridView und eine ObjectDataSource. Und ich möchte eine Zeile löschen. Aber wenn ich debugge, sehen Sie, dass der Wert von CustomerId immer 0 in meinem Business Logic Layer ist.Parameter zum Löschen einer Zeile

Hier ist mein Code

Ich habe zwei Lösch Parameter, Id und CustomerId. Dies sind die gleichen Namen wie die in meinem BLL.

<asp:GridView DataKeyNames="Id" ID="gvFavoriteMovies" DataSourceID="odsFavoriteMovies" AutoGenerateColumns="False" 
    runat="server"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate>    
        <asp:Label ID="lblTitel" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Title")%>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 

     <asp:CommandField ShowDeleteButton="True" /> 

    </Columns> 
</asp:GridView> 

<asp:ObjectDataSource ID="odsFavoriteFilm" runat="server" 
TypeName="MovieMonstrDataLayer.bll.BLLMovies" 
SelectMethod="GetFavoriteMoviesFromUser" 
DeleteMethod="DeleteFavoriteMoviesFromUser" 
onobjectcreating="odsFavoriteFilm_ObjectCreating" 
    ondeleting="odsFavoriteFilm_Deleting"> 
    <DeleteParameters> 
     <asp:Parameter Name="Id" DbType="Int32" Direction="Input" /> 
     <asp:Parameter Name="CustomerId" DbType="Int32" Direction="Input" /> 
    </DeleteParameters> 
    <SelectParameters> 
     <asp:Parameter DbType="Int32" Direction="Input" Name="CustomerId" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

Dies ist in der Code-behind-Datei

Wenn eine Zeile zu löschen, ordne ich den Wert des CustomerId in Kunden zum Löschen Parameter protokolliert. Das alles funktioniert. Ich gebe dem Löschparameter den richtigen Wert.

protected void odsFavoriteFilm_Deleting(object sender, ObjectDataSourceMethodEventArgs e) 
{ 
     if (Context.User.Identity.IsAuthenticated) 
     { 
      this.odsFavoriteFilm.DeleteParameters["CustomerId"].DefaultValue = ((MovieMonstrIdentity)Context.User.Identity).Customer.Id.ToString(); 
      this.odsFavoriteFilm.DataBind(); 
     } 
    } 

Normalerweise meine Business-Logik-Schicht in, sollte ich jetzt die richtige CustomerId, bekommen aber ich bekomme immer 0. Während keine Costumer diese ID hat.

public int DeleteFavoriteFilmFromUser(int Id, int CustomerId) 
    { 
     try 
     { 
      return Adapter.DeleteFavoriteFilmFromUser(Id, CustomerId); 
     } 

     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

Was mache ich falsch?

+0

Ich Komponieren einer vorgeschlagenen Antwort, aber aus Neugier, welchen Wert bekommen Sie für ID? – bitxwise

+0

ID ist die ID des Films. Ich bekomme die richtige ID des Films in meinem BLL. – Vinzcent

Antwort

2

Fügen Sie CustomerID in Ihrem DataKeyNames

<asp:GridView DataKeyNames="Id,CustomerId" ...> 

Entweder tun dies vor der Aktualisierung

protected odsFavoriteFilm_DataBinding(object sender, EventArgs e) { 
    if(!IsPostBack) { 
     this.odsFavoriteFilm.DeleteParameters["CustomerId"].DefaultValue = ((MovieMonstrIdentity)Context.User.Identity).Customer.Id.ToString(); 
    } 
} 

oder stellen Sie den aktuellen Parameterwert für den Befehl

protected void odsFavoriteFilm_Deleting(object sender, ObjectDataSourceMethodEventArgs e) { 
    if (Context.User.Identity.IsAuthenticated) { 
     e.Command.Parameters["CustomerId"].Value = ((MovieMonstrIdentity)Context.User.Identity).Customer.Id.ToString(); 
    } 
} 
+0

Danke. Ich habe die zweite Lösung benutzt und es funktioniert. Ich habe es ein bisschen anders gemacht. Es gab keine e.command.paramaters, aber e.InputParameters.Add() wurde verwendet. – Vinzcent

Verwandte Themen