The easiest way to do this is to use ScriptManager.RegisterClientScriptBlock.
In your control add the following function:
void AddHtmlLink(string rel, string href, string type)
{
ScriptManager manager = ScriptManager.GetCurrent(Page);
if (manager.IsInAsyncPostBack)
{
Dictionary<string, object> values = new Dictionary<string,object>();
values.Add("rel", rel);
values.Add("href", href);
values.Add("type", type);
JavaScriptSerializer serializer = new JavaScriptSerializer();
StringBuilder scriptBuilder = new StringBuilder();
scriptBuilder.Append("registerLink(");
serializer.Serialize(values, scriptBuilder);
scriptBuilder.AppendLine(");");
ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "LinkRegister", "linkRegister.js");
ScriptManager.RegisterClientScriptBlock(this, GetType(), "dynLink", scriptBuilder.ToString(), true);
}
else
{
HtmlLink link = new HtmlLink();
link.Href = href;
link.Attributes["rel"] = rel;
link.Attributes["type"] = type;
Page.Header.Controls.Add(link);
}
}
Here is a sample usage:
static int i = 0;
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
//Just some dummy test
i = 1 - i;
AddHtmlLink("Stylesheet", "Test" + (1-i).ToString() + ".css", "text/css");
}
On other thing you will need is the linkRegister.js file. Which will look like this:
function registerLink(obj) {
var link = document.createElement('link');
link.href = obj.href;
link.rel = obj.rel;
link.type = obj.type;
document.getElementsByTagName('head')[0].appendChild(link);
}
Sys.Application.notifyScriptLoaded(); There is one flaw in this solution: which is that it does not delete the existing link nodes from DOM. This can be easily solved by adding an Id to the link element and removing it before adding a new link. I leave it to you to implement it according to your needs.