Per Nergård (MVP)
Nov 17, 2010
  5232
(0 votes)

Custom properties with scripts made easy

If you do custom properties in my experience they often include some java scripting to accomplish what you want.

Doing JavaScript in code behind isn’t so much fun to say the least.

I sure have done my fair share of massive one liners that’s hard to maintain and if you touch them after 11pm you’re going to break them.

Splitting the scripts on several rows is more readable but messes up your code with endless lines of string concatenation.

So what to do? Virtual path providers and embedded resources is the solution.

Allan Thraen has done an excellent job with a single assembly self registrating virtual path provider which you can get here. It’s compiled for CMS5 but it works for CMS6 as well.

With this it’s a breeze to use embedded resources.

In this case add a new JavaScript file to your solution, right click and set it’s build action to embedded resource.

Now we have a nice place where we can place all our scripts nicely formatted and commented.

To read the script file contents you can use the following method. The only thing needed to change is the virtualpath variable which should should point to your resource. If unsure of the path check it out with reflector.

 

   1: protected virtual string LoadJavaScriptFunctions()
   2:         {
   3:             string virtualPath = "/App_Resource/Nergard.EPi.dll/Nergard.EPi.SpecializedPropertis.Scripts.CollapsableCMS6.js";
   4:             string input = string.Empty;
   5:             TextReader reader = null;
   6:             try
   7:             {
   8:                 reader = new StreamReader(VirtualPathProvider.OpenFile(virtualPath));
   9:                 input = reader.ReadToEnd();
  10:                 input = Regex.Replace(input, @"/\*[\w\W]+?\*/", string.Empty);
  11:                 input = "<script type=\"text/javascript\">\n" + input + "\n</script>";
  12:             }
  13:             catch (Exception exception)
  14:             {
  15:                 throw new Exception(string.Format("Error \"{0}\" when editor tried to read file \"{1}\"", exception.Message, virtualPath), exception);
  16:             }
  17:             finally
  18:             {
  19:                 if (reader != null)
  20:                 {
  21:                     reader.Close();
  22:                 }
  23:             }
  24:             return input;
  25:         }

Voila you now have a custom property with JavaScript that’s easy to maintain.

Nov 17, 2010

Comments

Nov 17, 2010 10:31 AM

Did you consider web resources as an alternative to this (http://support.microsoft.com/kb/910442)?

Per Nergård (MVP)
Per Nergård (MVP) Nov 17, 2010 11:16 AM

No id didn't. My initial thought was single assembly custom properties. So that they are self contained and can be dropped adn used at different customers in any combination with no hassle.

If I'm not mistaken webresources needs some configuration for them to work and would then introduce som hassle wich I was trying to avoid.

Please login to comment.
Latest blogs
Optimizely CMS 13 and the Alloy demo site

The Alloy demo site now runs on Optimizely CMS 13. Here’s a quick guide to getting it up and running locally.

Tomas Hensrud Gulla | Apr 10, 2026 |

A day in the life of an Optimizely OMVP: Getting Up to Speed with Optimizely CMS 13 — A Free Learning Path

If you're working with Optimizely and haven't started exploring CMS 13 yet, now's the time. I've put together a dedicated CMS 13 course within the...

Graham Carr | Apr 10, 2026

A day in the life of an Optimizely OMVP: Optimizely CMS 13 Is Here: The Features, The Add-Ons, and What's Coming Next

CMS 13 went GA on 31st March 2026, and after months of previews, webinars, and internal engineering sessions, it's finally real. I've been deep in...

Graham Carr | Apr 10, 2026

How to get the Page Tree back in Optimizely CMS

Lost the page tree in Optimizely CMS? Here's why it happens and the non-obvious fix to get it back.

Henning Sjørbotten | Apr 10, 2026 |