2009-05-27 11 views
2

Ich stieß auf ein sehr seltsames Verhalten in asp.net ObjectDataSource, die Beschreibung zu reproduzieren ist etwas lang, also ertragen Sie mit mir, während ich die Szene einstellen.ObjectDataSource reagiert auf auskommentiertes GridView?

Stellen Sie sich eine triviale ObjectDataSource/GridView-Kombination in einem Benutzersteuerelement vor. Die Object ruft eine Methode, die ein List von Objekten zurückgibt, und das Gridview zeigt diese Objekte in tabellarischer Form:

<div runat="server" ID="ControlWrapper"> 
    <asp:GridView ID="GridView1" AutoGenerateColumns="true" DataSourceID="ObjDataSource1" OnRowDataBound="GridView1_RowBound" runat="server"> 
    </asp:GridView> 

</div> 

<asp:ObjectDataSource ID="ObjDataSource1" runat="server" SelectMethod="GetBundle" OnSelecting="FixDataSource_Selecting" OnSelected="FixDataSource_Selected" 
    TypeName="West.VitalSigns.Contracts.ProdFixController"> 
</asp:ObjectDataSource> 

Dieser Ansatz wird in dem Code-behind mit ziemlich nichts arbeiten. Aber nehmen wir an, dass wir abhängig vom Inhalt der Datenbank eine Anzahl von GridView -s erstellen wollen. So kommentieren wir die Gridview in der Markup-out ...

<div runat="server" ID="ControlWrapper"> 
<!-- 
<asp:GridView ID="GridView1" AutoGenerateColumns="true" DataSourceID="ObjDataSource1" OnRowDataBound="GridView1_RowBound" runat="server"> 
    </asp:GridView> 
--> 
</div> 

... und fügen Sie etwas zu den Selected Ereignishandler Object:

protected void FixDataSource_Selected(object sender, ObjectDataSourceStatusEventArgs args) 
    { 
     HashSet<string> components = new HashSet<string<() 
     foreach (ProdFix fix in (List<ProdFix>)args.ReturnValue) 
     { 
      if (!components.Contains(fix.Component)) 
      { 
       GridView v = new GridView(); 
       v.ID=fix.Component.Replace(" " ,"").Replace("-",""); 
       v.AutoGenerateColumns = true; 
       v.DataSource = args.ReturnValue; 
       v.RowDataBound +=new GridViewRowEventHandler(BundleGrid_RowBound); 
       ControlWrapper.Controls.Add(v); 
       components.Add(fix.Component); 

      } 
     } 
    } 

Dieser Code funktioniert (oder zumindest die un -Vereinfachte Version funktioniert auf meinem Rechner), so entscheiden Sie den kommentierten-out Ausschnitt aus dem Markup zu entfernen (nicht wollen, dass cruft rumhängen, nachdem alle!)

<div runat="server" ID="ControlWrapper"> 

</div> 

Wenn Sie th tun ist aber der Code funktioniert nicht mehr! Die ObjectDataSource wird nicht ausgelöst, was bedeutet, dass das Ereignis Selected nie stattfindet, was bedeutet, dass Sie Ihre GridView -s nicht erhalten. Es sieht so aus, als ob ObjectDataSource auf auskommentiertes Markup in der aspx-Datei reagiert?

Also, das ist:

  • Ein Fehler in ASP.NET?
  • Eine nicht standardmäßige Möglichkeit, GridViews dynamisch zu erstellen?
  • Eine WTF, die ich sowieso nicht hätte ausprobieren sollen?
  • Alle oben genannten?

Antwort

4

Ihr Gridview-Steuerelement im Markup ist nicht verborgen, auch nicht mit den Kommentaren. HTML-Kommentare gelten nicht für serverseitige Tags. Verwenden Sie serverseitige Kommentare statt:

<% /* %>  <% */ %> 

oder

<%-– and -–%> 
+0

Dies ist eigentlich die Lösung. Verwenden Sie ASP oder Code Kommentare. HTML-Kommentare haben keine besondere Bedeutung für die asp.net-Server-Engine. –

0

24 Stunden später bemerkte ich, dass dieser Ansatz N Anzahl der Gitter-Ansichten zu bekommen war ziemlich albern. Anstatt einen ObjectDataSource zu verwenden, habe ich meinen Code umstrukturiert, um die GetBundle Methode direkt von Page_Load() aufzurufen und die GridViews programmatisch zu erstellen.

cdondoner hat die Antwort richtig über die serverseitigen Kommentare. Ich wusste nicht, dass es einen Unterschied gab.

0

Dies sollte auch funktionieren, da Sie damit „deaktivieren“, um den Tag sind:

<!--asp:GridView ID="GridView1" AutoGenerateColumns="true" DataSourceID="ObjDataSource1" OnRowDataBound="GridView1_RowBound" runat="server"> 
    </asp:GridView--> 
Verwandte Themen