So, tonight I had a RCP session with @JohnnoNolan – we decided that for our topic, we would like to “File > New Project” and see what it is like to replace the default ViewEngine in ASP.NET MVC with the Spark View Engine.
Why Spark View Engine?
I have heard a lot of buzz about it from the developer community. Also, I heard the podcast on Hanselminutes and the notion of it all just sat right with me - there shouldn’t be such an epic battle between HTML/C# in your views. Our sole purpose in the View is to render HTML based on some model data – make it easy.
RCP Session Aims
Neither myself or Johnno had any real experience with Spark before the session. As a starting point, I thought it would be good to cover what I would consider to be the “basics” for views:
- Using variables from ViewData.
- Using strongly-typed model data.
- Using master pages.
I decided to spend 1 hour before the session having a quick run-through of the install process and the basics in the hope of making the session more productive. This definitely helped (and I would always recommend spiking on something anyway).
I just want to (briefly) touch on what we got out of the session.
Install is EASY
- Go to the Spark download page.
- Get the latest stable release.
- Extract the files in the zip to wherever you store your third party assemblies.
- Create a new MVC application (Note there is a “gotcha” here with MVC versions – see below).
- Add a reference to Spark and Spark.Web.MVC.
- Add the following to Global.cs MvcApplication::Application_Start:
1: protected void Application_Start()
4: new SparkViewFactory());
That’s it – note there are some additional configuration steps that you may need, but I didn’t.
I definitely recommend also installing the VS Integration bits that come with the release package – makes working with Spark a LOT easier (including adding much-needed stuff like code colorisation).
ASP.NET MVC 1 & 2 Gotcha
Even though MS have mentioned in MCP programs, podcasts and MSDN documentation about NOT changing public API’s – guess what they did in MVC2? :) It turns out, there was a change to a constructor for a key class. This means that: If you do not have MVC 1 installed, then you MUST install it to use Spark (at this time).
NOTE: You can use Spark in MVC2 applications, you just need the MVC1 framework available.
I think this essentially boils down to Spark having a reference to System.Web.MVC, but “Specific Version” is set to “false” (so it auto-upgrades reference to 2.0 if 1.0 isn’t available). This is causing it to go BOOM!* With this error:
Method not found: 'Void System.Web.Mvc.ViewContext..ctor( System.Web.Mvc.ControllerContext, System.Web.Mvc.IView, System.Web.Mvc.ViewDataDictionary, System.Web.Mvc.TempDataDictionary)'.
* If anyone thinks I have misinterpreted the problem here – do comment and I will update!
Lesson to be learned? If you are building code against assemblies produced by a third party – set “Specific Version” to true to ensure that if they update it, your application doesn’t break :)
ViewData is Case Insensitive, “model” is NOT.
These are all the same, since the keys for ViewData are case-insensitive:
1: <viewdata Message="string" />
2: <viewdata MESSAGE="string" />
3: <viewdata MesSaGE="string" />
Obviously, the C# code will need to match the case used in declaration – for example:
However, the code required to setup Model data appears to be case sensitive (in kind of a weird way IMO).
1: <!-- Note the 'model' Attribute is All Lowercase -->
2: <viewdata model="ModelType" />
To access in C#:
1: // Note 'Model' has Capital 'M'
That one caught me out for 5 mins.
Master (Layout) Pages
Unfortunately, we never got around to setting up the master pages because we lost a fair bit of time to the MVC 1 vs 2 issue above.
I <3 Spark
I really, really enjoyed learning about Spark – just reading the documentation, I couldn’t stop grinning. The syntax/markup choices just makes sense (on the whole).
Looking at the markup, I have the distinct feeling that it is all easier for designers etc. to stomach – so if you are outsourcing design, I think Spark may well be a great way to go.
And for one line of code in Global (two if you want to completely remove WebForms)? Why didn’t I do this sooner?
Definitely going to be making sure Spark is the first thing I setup after “File > New Project” in future.