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.
Did you consider web resources as an alternative to this (http://support.microsoft.com/kb/910442)?
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.