script#: the .net response to the google web toolkit
DESCRIPTION
Script# is a free .NET tool that converts C# into JavaScript, allowing us to use a lot of existing C# tool support to write and manage large JavaScript code bases easier. This presentation introduces Script#, explains when and how to use it and discusses some common pitfalls with this tool. http://gojko.net/2008/10/01/script-the-net-response-to-the-google-web-toolkit/TRANSCRIPT
Script# - the .NET response to Google Web Toolkit
Gojko Adzic
http://gojko.net
Why should you care?
• A much more productive way to write and maintain complex JavaScript code– Compile-time consistency check– Refactoring support– Full Intellisense for DOM and your own JS
classes– Lots of other VS IDE benefits
• Free (not opensource, though)
What Script# is not
• It does not hide browser complexity
• It does not abstract away JS peculiarities
• It is not a general-purpose .NET to browser converter
• It is not a widget/effect library (it has some, but not nearly like GWT)
Under the hood
• Compiles C# into JS directly• Replacement for System namespace, a mashup
of .NET and JS– Sscorlib.dll in C# for Intellisense, – sscorlib.js in the browser– sscompat.js provides cross-browser compatibility
• System.DHTML.Document, System.Script System.DHTML.Window link to the environment
A very simple example
• Script# library project
• Compile C# into javascript
• Execute from HTML– namespace.class used to instantiate objects
• If you do the web site by hand, don’t forget sscompat.js!
Visual Studio Integration
• Project templates for class libraries and web sites
• C# editor for scriptlets (has some bugs, though)
MSBuild Integration
• ScriptSharp target does the job for you <Import Project="$(ProgramFiles)\nStuff\ScriptSharp\v1.0\nStuff.ScriptSharp.targets" />
• Remember <NoStdLib>True</NoStdLib>
• Automatically added by the VS ScriptSharp template
Scriptlets
• Script# webforms components– Add Script# assembly and page control to
web.config– Use main() as an entry point to the
component
• No need to worry about script# initialisation
• Put all scripts into App_Scripts folder (or use a VS template to create the project)
AJAX support
• Add <script type="text/javascript" src="App_Scripts/ssfx.Core.Debug.js" >
</script>
• Use ScriptFX.Net.HTTPRequest for cross-browser compatible AJAX requests
• Supports Script transport for Cross-Domain Ajax!
Ajax/JSON
private void OnOKButtonClick(object sender, EventArgs e) { Dictionary parameters = new Dictionary(); parameters["prefix"] = _prefixTextBox.Text; parameters["count"] = 5;
_request = HTTPRequest.CreateRequest("CompletionList.ashx/GetItemsViaPost", HTTPVerb.POST);
_request.SetContentAsJSON(parameters); _request.Invoke(new HTTPRequestCompletedCallback(OnRequestComplete), null); } private void OnRequestComplete(HTTPRequest request, object context) { if (_request == request) { string[] values = (string[])_request.Response.GetObject(); _valuesLabel.Text = values.Join(", "); } }
Behaviours
• Declaratively attach functionality to DOM elements
• Taken from ASP.NET Ajax (Atlas)
• Popups, watermark, autocomplete, overlay etc…
• Not a lot of widgets, but you can use ExtJS with ExtSharp!
More advanced options
• FxCop code analysis
• Unit testing should follow soon
• ASP.NET Ajax instead of sscorelib
• Some silverlight support
• MSN Messenger APIs
• Facebook client API
• Sidebar Gadgets
Quirks: Namespace references
• Does not work:DOMElement runner=
System.DHTML.Document.GetElementById(
runnerElementId);
• Works:Using System.DHTML;
DOMElement runner= Document.GetElementById(runnerElementId);
Quirks: Compilation issues
• VS New class wizard adds System, System.Data and System.Xml references– Script# compilation breaks as a result
• Does not resolve indirect module dependencies
• Nested namespaces not supported
Quirks: 0 and null comparisons
• if (something == null) and if (something == 0) compiled into if (!something)
• Try this:
Number a = null;
if (a == 0)
Script.Alert("I shouldn't be seeing this???");
Number b = 0;
if (b == null)
Script.Alert("I shouldn't be seeing this either???");
Quirks: Scriptlets
• Scriptlet tag has to be inside a form tag– If not, nothing happens, but you don’t get an
alert
• Inline Scriptlets use ScriptletArguments, pre-compiled ones use Dictionary
Quirks: Events
• DOMEventHandler expects void() delegate
• Use Window.Event.ReturnValue to return false from an event
What’s good?
• Working with complex JS files is much very productive
• VS integration
• MSBuild integration
• Basic Documentation is great
What’s not so good?
• Some unintuitive mismatch between C# and JS – type conversions, 0 and null…
• Advanced stuff not documented that well– See the samples zip in the distribution!
• Still not opensource
Where next?
• http://gojko.net
• http://projects.nikhilk.net/ScriptSharp/
• http://code.google.com/p/extsharp/
• http://www.codeplex.com/JQuerySharp
What next?
• Dependency Injection with Castle – Oct 23rd
• Asynchronous Enterprise Applications with NServiceBus – Nov 27th
• TDD with .NET – Dec 17th
• ALT.NET Community evening – Jan 13th