A critical vulnerability was discovered in React Server Components (Next.js). Our Systems Remain Fully Protected. Learn More

Per Nergård (MVP)
Nov 17, 2010
  5124
(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
Jhoose Security Modules v2.6.0 — Added support for Permissions Policy and .NET 10

Version 2.6.0 adds Permissions Policy header support, updates to .NET 10, improved policy management, configurable security settings, and enhanced...

Andrew Markham | Dec 6, 2025 |

Building a 360° Customer Profile With AI: How Opal + Optimizely Unlock Predictive Personalization

Creating truly relevant customer experiences requires more than collecting data—it requires understanding it. Most organizations already have rich...

Sujit Senapati | Dec 4, 2025

Building a Lightweight Optimizely SaaS CMS Solution with 11ty

Modern web development often requires striking a difficult balance between site performance and the flexibility needed by content editors. To addre...

Minesh Shah (Netcel) | Dec 3, 2025

Creating Opal Tools Using The C# SDK

Over the last few months, my colleagues at Netcel and I have partaken in two different challenge events organised by Optimizely and centered around...

Mark Stott | Dec 3, 2025