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
http://gojko.net
[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
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 crossbrowser compatible AJAX requests
• Supports Script transport for CrossDomain 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