210 likes | 353 Views
Script# - the .NET response to Google Web Toolkit. Gojko Adzic http://gojko.net gojko@gojko.com. Why should you care?. A much more productive way to write and maintain complex JavaScript code Compile-time consistency check Refactoring support
E N D
Script# - the .NET response to Google Web Toolkit Gojko Adzic http://gojko.net gojko@gojko.com
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