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?
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. –