2008-12-10 8 views
0

J'ai eu des problèmes avec les problèmes de référencement des contrôles enfants dans un formulaire. Un autre développeur a écrit une page ASPX qui est en train de compiler et de travailler et, dans ce code, il fait référence aux contrôles enfants dans un FormView directement comme comme propriétés de l'objet page. La page fait partie d'un projet SITE Web ASP.NET (par opposition à un projet d'application Web). Nous avons décidé de convertir le projet en modèle de projet d'application Web et avons remarqué que ces références de propriétés ne sont pas compilées. Le code derrière le fichier ne génère pas les contrôles dans la vue formulaire. Pendant que je faisais des recherches sur ce problème (j'avais un message séparé à propos de ces problèmes), je suis tombé sur quelque chose de déconcertant. doit toujours référencer les contrôles enfants dans un modèle FormView à l'aide de FindControl. Modèle de projet ou modèle de projet d'application Web.ASP.NET Compiler les changements de comportement en fonction du contenu de la page?

J'ai été intrigué par la façon dont le code de mon collègue compilé et exécuté. Comme je l'ai indiqué, il référence les contrôles enfants contenus de FormView via des propriétés simples dans la page et n'a pas eu recours aux appels FindControl. Donc, pour aller au fond de ce mystère, j'ai préparé l'exemple le plus court qui démontre ce phénomène.

Ce que j'ai trouvé était très étrange. Le code que j'ai ici a un ASP: FormView avec quelques contrôles d'étiquette dans son ItemTemplate. L'une de ces étiquettes porte l'ID MyComment. Lorsque les fiches de données FormView (dans la table des produits de Northwind), j'ai simplement mis du texte.

using System; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     this.FormView1.ChangeMode(FormViewMode.ReadOnly); 
    } 
    protected void FormView1_DataBound(object sender, EventArgs e) { 
     MyComment.Text = "Data bound at " + DateTime.Now.ToString(); 
    } 
} 

Ce code ne sera pas compilé car MyComment n'est pas une propriété valide. Voici la partie étrange. Si j'insère dans ItemTemplate de FormView un contrôle TabContainer de la bibliothèque Ajax Control Toolkit, le code ci-dessus compile et s'exécute correctement.

La raison pour laquelle le code de mon collègue compile est donc le contrôle TabContainer intégré au formulaire. Pourquoi cela devrait changer le comportement du compilateur et les mécanismes par lesquels vous pouvez accéder aux contrôles enfants de FormView est un mystère pour moi. Incidemment, malgré le fait qu'il compile proprement et fonctionne correctement, Intellisense ne voit pas ces propriétés et ReSharper les signale comme des erreurs de compilation (par le voyant rouge dans la barre d'indicateurs).

Voici le balisage de la page. Quelqu'un peut-il faire la lumière sur ce comportement? Incidemment, je ne me plains pas du fait que ASP.NET crée ces propriétés dans cette circonstance. (Malheureusement, ce comportement heureux, mais étrange, ne semble s'appliquer que si le projet est un projet de site Web, en tant que projet d'application Web, les accesseurs de propriété ne fonctionnent pas dans FormView même avec le TabControl intégré).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <div> 
     <asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID" DataSourceID="SqlDataSource1" 
      OnDataBound="FormView1_DataBound"> 
      <ItemTemplate> 
       <ajaxToolkit:TabContainer runat="server" ID="TabsItem"> 
        <ajaxToolkit:TabPanel runat="Server" ID="PanelBasicsItem" HeaderText="Basics"> 
         <ContentTemplate> 
          ProductID: 
          <asp:Label ID="ProductIDLabel" runat="server" Text='<%# Eval("ProductID") %>' /> 
          <br /> 
          ProductName: 
          <asp:Label ID="ProductNameLabel" runat="server" Text='<%# Bind("ProductName") %>' /> 
          <br /> 
          My Comment: 
          <asp:Label ID="MyComment" runat="server"></asp:Label> 
          <br /> 
         </ContentTemplate> 
        </ajaxToolkit:TabPanel> 
       </ajaxToolkit:TabContainer> 
      </ItemTemplate> 
     </asp:FormView> 
     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
      SelectCommand="SELECT [ProductID], [ProductName] FROM [Alphabetical list of products]"> 
     </asp:SqlDataSource> 
    </div> 
    </form> 
</body> 
</html> 

Répondre

0

Lorsque vous avez converti le site Web à une application web , avez-vous vérifié que les classes partielles ont été correctement générées pour vos fichiers ASPX (par exemple, il devrait y avoir un fichier appelé « Default.aspx.cs .designer "dans votre application Web, sous les fichiers Default.aspx et Default.aspx.cs).

Dans un site web , ceux-ci sont générés à la volée par le serveur que votre site fonctionne et est compilé (et donc n'existent pas dans votre projet), alors que dans une application web ils sont créés et gérées par Visual Studio - si elles n'existent pas, le code risque de ne pas pouvoir être compilé car les objets n'ont pas été créés - quelle est l'erreur réelle du compilateur? En ajoutant un nouveau contrôle à la page après avoir converti le projet en application Web, vous forcez VS à créer la classe partielle manquante.

0

Zhaph,

Nous vous remercions de votre réponse. Oui, les fichiers du concepteur sont là. Je pense que j'ai trop mis dans ma question et a un peu embrouillé la question. Le comportement déroutant est démontré dans le projet Web SITE.

La ligne du bas est que les propriétés dans FormView ne compileront pas SAUF s'il existe un contrôle TabContainer intermédiaire dans le FormView. Si le TabContainer est là, les propriétés se compilent et fonctionnent. Si le TabContainer est supprimé de FormView, le code ne sera pas compilé. Très étrange. Jusqu'à présent, personne ne peut expliquer cela.

Questions connexes