Set Visible property with server tag <%= %> in Framework 3.5

The code you posted is not valid syntax for server tags in the ASP.NET 2.0 or ASP.NET 4.0 runtimes. In either version, trying to set the visible property using <%= ... %> in a server tag should result in a parser error:

Parser Error Message: Cannot create an object of type 'System.Boolean' from its string representation '<%=MyVisiblePropertyOnCodeBehind%>' for the 'Visible' property.

You have two options other than just setting the Visible property in the codebehind or a <script runat="server"> tag. The first is to use a databinding on the Visible property. You'll need to call the DataBind() method on either MyId or one of its parent controls for the value to be bound.

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

The other option is to write the code as follows:

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

The disadvantage of this approach is that you won't be able to programmatically add controls to the page or control that contains the code blocks. If you try to you should get an error:

The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>)

All that being said, I think just setting the property the way you are doing it now is the way to go.


As for ASP.NET aspx page's inline expression. <% %> can only be used at aspx page or user control's top document level, but can not be embeded in server control's tag attribute (such as <asp:Button... Text =<% %> ..>). As you've found you can create custom expression builder in ASP.NET 2.0 to add your inline expression.

BTW, another means for supplying values to server control properties in aspx inline tempalte is using <%# %> databinding expression. This is built-in supported. The only different from other inline expression is that method on the target control or its Container control.

Steven Cheng

Microsoft MSDN Online Support Lead

Full post here: http://www.aspnet-answers.com/microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx

And workaround here: ASP.net Inline Expression Issue


Here is another approach which maintains the simplicity of the code from your original question. Here you would have to remove the runat="server" from the div tag and use css "display:none" instead of the "Visible" property. The downside to this approach is that the tag still gets sent to the browser even if it is not visible and the visibility is handled on the client side.

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

Just set a variable to true/false on your pageLoad event like this

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;
    }
}   

Then in your control properties inside aspx page, set their visibility via a property like

Visible="<%# !IsEditMode %>"