58 votes

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

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

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

Cela fonctionne sur le cadre 4, mais maintenant, essayer de l'utiliser sur un Framework 3.5 projet, il ne semble pas fonctionner. Est-ce un Framework 4 seule fonctionnalité? Est-il plus cool (et .aspx côté) alternative à la définition de la visibilité depuis le code-behind? Je suis à l'aide de la vilaine:

    MiId.Visible = MyVisiblePropertyOnCodeBehind

Merci d'avance,

Tom

[ÉDITÉ] SOLUTION:

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

C'était de ma faute en plus d'une chose.

Dans le VS2010 projet, nous avons été à l'aide de <%# au lieu de <%=

Aussi, je n'ai pas d'avis que, dans le VS2010 projet, nous avons été à l'aide de pages hérité de pas de "Page", mais à partir d'un CustomPage classe, qui faisait la liaison automatiquement, sans me remarquer, et qui me fait penser que c'était un Framework 4.0 seule caractéristique.

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

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

vous pouvez le faire fonctionner, ajoutant ce qui suit à la codebehind:

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

Comme je l'ai lu, ce DataBind() peut réduire les performances de l'application. Avez-vous idée de combien? Cela pourrait-il être compris comme un "professionnel" de la technique pour être utilisé sur les gros projets, ou pensez-vous qu'il devrait être évité?

J'aime la façon dont il fait de balisage lisible et facile à comprendre en un seul point de vue, mais je ne voudrais pas être coupable de la lenteur de code parce que.

80voto

rsbarro Points 12575

Le code que vous avez posté n'est pas une syntaxe valide pour le serveur de balises dans l'ASP.NET 2.0 ou ASP.NET 4.0 runtimes. Dans les deux versions, en essayant de définir la propriété visible à l'aide de <%= ... %> dans une balise de serveur devrait aboutir à une erreur de l'analyseur:

Analyseur Message d'Erreur: Impossible de créer un objet de type 'System.Boolean' à partir de sa représentation sous forme de chaîne '<%=MyVisiblePropertyOnCodeBehind%>' pour le "Visible" de la propriété.

Vous avez deux options autres que la seule définition de l' Visible propriété dans le code-behind ou un <script runat="server"> balise. La première consiste à utiliser une liaison de données sur l' Visible de la propriété. Vous aurez besoin de demander l' DataBind() méthode sur MyId ou l'un de ses parents contrôles de la valeur à être lié.

<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 serez pas en mesure d'ajouter par programmation des contrôles à la page ou de contrôle qui contient les blocs de code. Si vous essayez de vous devriez obtenir un message d'erreur:

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

Tout cela étant dit, je pense que la définition de la propriété de la façon dont vous le faites maintenant, c'est le chemin à parcourir.

3voto

arunes Points 1932

Comme pour ASP.NET page aspx inline expression. <% %> ne peut être utilisé à page aspx ou de contrôle de l'utilisateur de haut niveau du document, mais ne peut pas être incorporés dans serveur de contrôle de l'attribut de balise (comme ..>). Comme vous l'avez trouvé, vous pourrez créer des générateur d'expression dans ASP.NET 2.0 ajouter votre inline expression.

BTW, un autre moyen pour fournir des valeurs de contrôle du serveur les propriétés dans aspx inline tempalte est à l'aide de <%# %> liaison de données d'expression. C'est construit-dans la prise en charge. La seule différente des autres inline expression méthode sur la cible de contrôle ou de son Récipient de contrôle.

Steven Cheng

MSDN de Microsoft en Ligne le Soutien de Plomb

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

Et d'une solution ici: ASP.net Inline Expression de la Question

2voto

Damien Joe Points 2566

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 %>" 
 

2voto

Ryan Dansie Points 169

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>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X