2009-05-27 1 views
2

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?

Répondre

4

Votre contrôle gridview dans le balisage n'est pas masqué, même avec les commentaires. Les commentaires HTML ne s'appliquent pas aux tags côté serveur. Utilisez les commentaires côté serveur à la place:

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

ou

<%-– and -–%> 
+0

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

0

24hrs plus tard, j'ai remarqué que cette approche pour obtenir le numéro N de grille-vue était assez stupide. Au lieu d'utiliser un ObjectDataSource j'ai refaçonné mon code pour appeler simplement la méthode GetBundle directement à partir de Page_Load() et créer les GridViews par programmation.

cdonner a la réponse correcte sur les commentaires côté serveur. Je n'ai pas réalisé qu'il y avait une différence.

0

Cela devrait fonctionner aussi, puisque vous êtes « désactiver » l'étiquette avec elle:

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