Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 712
  • Last Modified:

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

I am trying to add a meta tag programatically. However, I get the error :

The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>)., when trying to add. See code below.

I do not want to move the script in <%...%> in the body as it is present in all my aspx files. How can I get this to work without making any changes in the aspx page.
<%@ Page language="c#" Inherits="Adomo.Web.Login" CodeFile="Default.aspx.cs" Title="<%$ Resources:PageTitle %>" %>
<!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 />
		<meta name="vs_snapToGrid" content="False" />
		<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR" />
		<meta content="C#" name="CODE_LANGUAGE" />
		<meta content="JavaScript" name="vs_defaultClientScript" />
		<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema" />
		<link href="AdomoCss.css" type="text/css" rel="Stylesheet" /><%
    /*	Add reference for language dependent stylesheet to override layout where needed for non en-US pages. Typically, column widths will be overruled where needed.
Not added for pages called with en-US or with no culture tag (admin pages). */
    if (cultureTag != null && cultureTag != "en-us")
    {
        Response.Write("<link href='AdomoCss." + cultureTag + ".css' type='text/css' rel='Stylesheet' />");
    }
		%>
</head>
 
Adding the html meta tag in code behind in OnLoad method
 
HtmlMeta meta = new HtmlMeta();
meta.HttpEquiv = "X-UA-Compatible";
meta.Content = "IE=EmulateIE7";
this.Header.Controls.Add(meta);

Open in new window

0
anshugupta_fremont
Asked:
anshugupta_fremont
  • 2
2 Solutions
 
tetorvikCommented:
There are couple of options I am aware of:

1# remove the Response.Write() and add the css link dynamically in code-behind
http://www.aspdotnetfaq.com/Faq/How-to-Programmatically-add-CSS-Stylesheet-file-to-Asp-Net-page.aspx

2# change the <%= %> to binding expression <%# %>
http://leedumond.com/blog/the-controls-collection-cannot-be-modified-because-the-control-contains-code-blocks/
0
 
anshugupta_fremontAuthor Commented:
Do I have any other option (within code behind), that doesnt require change in the aspx file (because , I will have to make this change in 10 other aspx file).

Also, can you please explain why this is happening?

Thanks in Advance
0
 
tetorvikCommented:
Apparently you are modifying HtmlHead's control collection at code-behind and at aspx page, which is not allowed. I am not aware of the exact reason why this is not allowed.

However I came across one additional hack that gets you around the issue without modifying code-behind code. You'll need to wrap your head (<%=...%>) fragmant with some placeholder (asp:PlaceHolder will do), then you're not modifying the same control collection anymore.
<asp:PlaceHolder runat="server" ID="fbar"> 
<%
  if (cultureTag != null && cultureTag != "en-us")
  {
        Response.Write("<link href='AdomoCss." + cultureTag + ".css' type='text/css' rel='Stylesheet' />");
  }
    
%>
</asp:PlaceHolder>

Open in new window

0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now