Je suis tombé sur un comportement très étrange dans le ObjectDataSource
d'asp.net, la description à reproduire est un peu longue, alors supportez-moi pendant que je prépare la scène. Donc, imaginez un combo ObjectDataSource/GridView trivial dans un contrôle utilisateur. Le ObjectDataSource appelle une méthode qui retourne un List
d'objets et GridView montre ces objets sous forme de tableau:ObjectDataSource réagit à GridView commenté?
<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>
Cette approche fonctionne avec à peu près rien dans le code-behind. Mais disons que nous voulons créer n nombre de GridView
-s en fonction du contenu de la base de données. Donc, nous commentons le GridView dans le balisage ...
<div runat="server" ID="ControlWrapper">
<!--
<asp:GridView ID="GridView1" AutoGenerateColumns="true" DataSourceID="ObjDataSource1" OnRowDataBound="GridView1_RowBound" runat="server">
</asp:GridView>
-->
</div>
... et d'ajouter quelque chose comme ça pour le gestionnaire d'événements de Selected
ObjectDataSource:
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);
}
}
}
Ce code fonctionne (ou au moins un Version -simplified fonctionne sur ma machine), de sorte que vous décidez de supprimer la section en commentaire de la marge bénéficiaire (ne veulent pas que cruft traîner, après tout!)
<div runat="server" ID="ControlWrapper">
</div>
Lorsque vous e est, cependant, le code ne fonctionne plus! ObjectDataSource ne se déclenche pas, ce qui signifie que l'événement Selected
ne se produira jamais, ce qui signifie que vous n'obtiendrez pas votre GridView
-s. Il semble que ObjectDataSource réagisse au balisage commenté dans le fichier aspx?
Alors, est-ce:
- Un bug dans ASP.NET?
- Une manière non standard de créer dynamiquement GridViews?
- Un WTF que je n'aurais pas dû essayer de toute façon?
- Tout ce qui précède?
Ceci est en fait la solution. Utilisez ASP ou les commentaires de code. Les commentaires HTML n'ont aucune signification particulière pour le moteur de serveur asp.net. –