A colleague of mine told me recently about Razor, the view engine for ASP.NET MVC 3, and upon researching it and using it in a test project, I almost instantly came to compare it to NHaml since I’ve been using HAML for several years doing rails on the side. What I found is that though Razor is the best view engine I’ve seen from Microsoft (on top of a great version 3 of ASP.NET MVC – nice job guys), I still believe NHaml’s syntax is significantly better suited for HTML applications and even more so if they use JQuery.
Though Razor does a great job requiring minimal characters to insert executable code logic in between the markup it generates (and is basically equivalent in that respect to HAML), it does nothing for minimizing the amount of code you have to write to express the HTML outside of those logic statements. NHaml is simply superior here when you are generating HTML for this reason: it reduces markup to the minimal information needed to identify the JQuery or CSS selectors that elements have applied to them.
It does this because with NHaml normally you specify the name of an element without the angle brackets, but if the tag you want is a DIV element with an ID attribute, you can just specify the ID prefixed by a hash symbol and drop the DIV altogether.
<div id=”blah”></div>
becomes:
#blah
This also works for CSS classes. This dramatically increases code readability because lines of code begin with the JQuery selector or CSS style name used to access them. When writing Javascript or CSS, locating these elements in markup is much easier. This is already on top of the fact that NHaml drops the requirement for closing tags.
Here’s an example that I think illustrates the point. Let’s say I have a CSS style sheet with the following styles. Don’t worry about the attributes in the styles themselves just look over the list of CSS selector names (container, banner etc.) and think of looking at this file day to day:
#container { width: 100%; }
#banner { background-color: blue; }
.topic { font-size: 14pt; }
Now here’s some HTML markup styled with selectors in the above sheet in HAML:
#container
#banner
.topic Hello
Here’s how you would generate the exact same markup using Razor:
<div id=”container”>
<div id=”banner”>
<div class=”topic”>Hello</div>
</div>
</div>
:css
.topic { font-size: 14pt; }
:javascript
alert(‘hello!’);
#container
#banner
.topic Hello
and here’s Razor:
<style type=”text/css”>
.topic { font-weight: bold }
</style>
<javascript type=”text/javascript”>
alert(‘hello’);
</javascript>
<div id=”container”>
<div id=”banner”>
<div class=”topic”>Hello</div>
</div>
</div>
Hopefully you can see the HAML is much easier to read, and reduced in lines of code by about 15% in this example.
Here’s another great post from late last year that shows some comparisons of Razor and NHaml.