I couldn't use the Microsoft.Sharepoint.WebControls.CssRegistration class becuase I was in a sandbox solution. So I thought let's try using standard .Net methods, like adding to the Page.Headers collection, but in my sandbox WebPart that property was always null.
I couldn't find anyway of adding the Stylesheet reference server side from a WebPart in a sandbox environment. The only option left was to use client side javascript to dynamically add the reference to the DOM.
Here is a snippet of code from my WebPart that accomplishes this:
protected override void RenderContents(HtmlTextWriter writer)
{
StringBuilder js = new StringBuilder();
js.AppendLine("var added = false");
js.AppendLine("for (i = 0; (a = document.getElementsByTagName(\"link\")[i]); i++)");
js.AppendLine("{");
js.AppendLine(" if (a.getAttribute(\"rel\").indexOf(\"style\") != -1");
js.AppendLine(" && a.getAttribute(\"href\").indexOf(\"kwsresourcebooking365\") != -1)");
js.AppendLine(" {");
js.AppendLine(" added = true;");
js.AppendLine(" }");
js.AppendLine("}");
js.AppendLine("if(!added)");
js.AppendLine("{");
js.AppendLine(" var head = document.getElementsByTagName(\"head\")[0];");
js.AppendLine(" if(document.createStyleSheet)");
js.AppendLine(" {");
js.AppendLine(" document.createStyleSheet('" + SPContext.Current.Site.Url + "/style%20library/folder/style.css" + "');");
js.AppendLine(" } else {");
js.AppendLine(" var css = document.createElement('link');");
js.AppendLine(" css.type = 'text/css';");
js.AppendLine(" css.rel = 'stylesheet';");
js.AppendLine(" css.href = '" + SPContext.Current.Site.Url + "/style library/folder/style.css" + "';");
js.AppendLine(" head.appendChild(css);");
js.AppendLine(" }");
js.AppendLine("}");
base.RenderContents(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript");
writer.RenderBeginTag(HtmlTextWriterTag.Script);
writer.WriteLine(js.ToString());
writer.RenderEndTag();
}
The Javascript will first check to see if the Stylesheet link exists in the head. If it doesn't exist then it will check to see if the createStyleSheet method is available, which essentially means that we are in Internet Explorer or else manually create link tag.
I did consider using the Sharepoint client script manager, but I think there maybe sandbox restrictions there too and I was growing tired of hitting sandbox brick walls.
I hope this saves you some time and frustration!
1 comments:
Thx for this piece of code - safed my day .. it's not so easy to work with sandboxed solutions ;)
Post a Comment