Script# - the .NET response to the Google Web Toolkit

Download Report

Transcript Script# - the .NET response to the Google Web Toolkit

Script# - the .NET response to
Google Web Toolkit
Gojko Adzic
[email protected]
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
– 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
Visual Studio Integration
• Project templates for class libraries and
web sites
• C# editor for scriptlets (has some bugs,
MSBuild Integration
• ScriptSharp target does the job for
you <Import
0\nStuff.ScriptSharp.targets" />
• Remember <NoStdLib>True</NoStdLib>
• Automatically added by the VS
ScriptSharp template
• Script# webforms components
– Add Script# assembly and page control to
– Use main() as an entry point to the
• No need to worry about script#
• 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" >
• Use ScriptFX.Net.HTTPRequest for crossbrowser compatible AJAX requests
• Supports Script transport for CrossDomain Ajax!
private void OnOKButtonClick(object sender, EventArgs e) {
Dictionary parameters = new Dictionary();
parameters["prefix"] = _prefixTextBox.Text;
parameters["count"] = 5;
_request = HTTPRequest.CreateRequest("CompletionList.ashx/GetItemsViaPost",
_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(", ");
• Declaratively attach functionality to DOM
• Taken from ASP.NET Ajax (Atlas)
• Popups, watermark, autocomplete, overlay
• 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=
• Works:
Using System.DHTML;
DOMElement runner=
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
• 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
• Inline Scriptlets use ScriptletArguments,
pre-compiled ones use Dictionary
Quirks: Events
• DOMEventHandler expects void()
• 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?
What next?
• Dependency Injection with Castle – Oct
• Asynchronous Enterprise Applications
with NServiceBus – Nov 27th
• TDD with .NET – Dec 17th
• ALT.NET Community evening – Jan 13th