web-dev-qa-db-fra.com

Définir la propriété Visible avec la balise de serveur <% =%> dans Framework 3.5

J'ai travaillé dans un projet .NET Framework 4 à l'aide de balises de serveur, telles que <% = any%>, pour définir la visibilité des contrôles runat = "server", comme suit:

  <div id="MyId" runat="server" visible="<%=MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

Cela fonctionne sur Framework 4, mais essayer maintenant de l'utiliser sur un projet Framework 3.5 ne semble pas fonctionner. Est-ce une fonctionnalité de Framework 4 uniquement? Existe-t-il une alternative plus intéressante (et côté .aspx) à la définition de la visibilité depuis codebehind? J'utilise le moche:

    MiId.Visible = MyVisiblePropertyOnCodeBehind

Merci d'avance,

À M

[EDITED] SOLUTION:

Merci pour vos commentaires qui me font comprendre mon problème et la solution!

C'était ma faute dans plus d'une chose.

Dans le projet VS2010, nous utilisions <% # au lieu de <% =

De plus, je n'ai pas remarqué que dans le projet VS2010, nous utilisions des pages héritées non pas de "Page", mais d'une classe CustomPage, qui établissait automatiquement la liaison, sans que je m'en rende compte, ce qui me fait penser qu'il s'agissait d'un Framework. 4.0 seulement caractéristique.

Comme vous l'avez dit ici, si vous avez le balisage suivant:

  <div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

vous pouvez le faire fonctionner, en ajoutant ce qui suit au codebehind:

    public bool  MyVisiblePropertyOnCodeBehind = true;
    protected void Page_Load(object sender, EventArgs e) {
        DataBind();
        // Or if you want only for one control, MyId.DataBind();             
    }

Au fur et à mesure que je lis, DataBind () peut réduire les performances de l'application. Avez-vous une idée de combien? Cela pourrait-il être compris comme une technique "professionnelle" à utiliser sur de grands projets ou pensez-vous que cela devrait être évité?

J'aime la façon dont le balisage est lisible et facile à comprendre en une seule vue, mais je n’aimerais pas être coupable de code lent à cause de cela.

53
tomasofen

Le code que vous avez publié n'est pas une syntaxe valide pour les balises de serveur dans les environnements d'exécution ASP.NET 2.0 ou ASP.NET 4.0. Dans les deux versions, essayer de définir la propriété visible à l'aide de <%= ... %> Dans une balise de serveur devrait générer une erreur d'analyse syntaxique:

Message d'erreur de l'analyseur: impossible de créer un objet de type 'System.Boolean' à partir de sa représentation sous forme de chaîne '<% = MyVisiblePropertyOnCodeBehind%>' pour la propriété 'Visible'.

Vous avez deux autres options que de simplement définir la propriété Visible dans le codebehind ou une balise <script runat="server">. La première consiste à utiliser une liaison de données sur la propriété Visible. Vous devrez appeler la méthode DataBind() sur MyId ou sur l'un de ses contrôles parent pour que la valeur soit liée.

<div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
</div>

L'autre option consiste à écrire le code comme suit:

<% if(MyVisiblePropertyOnCodeBehind) { %>
<div id="MyId" runat="server">
    Content
</div>
<% } %>

L'inconvénient de cette approche est que vous ne pourrez pas ajouter par programme de contrôles à la page ou au contrôle contenant les blocs de code. Si vous essayez, vous devriez obtenir une erreur:

La collection de contrôles ne peut pas être modifiée car le contrôle contient des blocs de code (c'est-à-dire <% ...%>)

Cela étant dit, je pense que la meilleure chose à faire est de configurer la propriété de la façon dont vous la faites maintenant.

74
rsbarro

En ce qui concerne l'expression inline de la page ASP.NET aspx. <%%> ne peut être utilisé qu'au niveau de la page aspx de la page aspx ou du contrôle utilisateur, mais ne peut pas être incorporé dans l'attribut tag du contrôle serveur (tel que <asp:Button... Text =<% %> ..>). Comme vous l'avez constaté, vous pouvez créer un générateur d'expression personnalisée dans ASP.NET 2.0 pour ajouter votre expression en ligne.

BTW, un autre moyen de fournir des valeurs aux propriétés de contrôle du serveur dans aspx inline tempalte consiste à utiliser une expression de liaison de données <% #%>. Ceci est intégré pris en charge. La seule différence par rapport aux autres expressions en ligne est cette méthode sur le contrôle cible ou son contrôle Container.

Steven Cheng

Responsable du support en ligne Microsoft MSDN

Article complet ici: http://www.aspnet-answers.com/Microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx

Et la solution de contournement ici: Problème d’expression en ligne ASP.net

3
arunes

Définissez simplement une variable sur true/false sur votre événement pageLoad comme ceci

private bool IsEditMode {get; set;}      

protected bool IsVisible 
{
    get { retun IsEditMode ;}
    set { IsEditMode =value;}
}  

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // based on some condition set this to true or false 
        isEditMode=true;
    }
}   

Puis, dans vos propriétés de contrôle de la page aspx, définissez leur visibilité via une propriété comme

Visible="<%# !IsEditMode %>" 
3
Zo Has

Voici une autre approche qui maintient la simplicité du code de votre question initiale. Ici, vous devrez supprimer le runat = "server" de la balise div et utiliser css "display: none" au lieu de la propriété "Visible". L'inconvénient de cette approche est que la balise est toujours envoyée au navigateur, même si elle n'est pas visible et que la visibilité est gérée du côté client.

<div style='<%=MyVisiblePropertyOnCodeBehind ? "" : "display: none" %>' >
    Content
</div>
2
rdans