Having used Seaside the past few years I've found template systems to be a bad code smell. Is there a framework for .net using something similar to the Seaside canvas system for generating html, css and javascript? Or else a way to avoid the duplication I tend to find in templates.
[Edit] NHaml does not come close to what I'm looking for. The point is not having a shorthand for (X)HTML, but having a programming language in which I can refactor and reuse the code.
In Seaside, it might look like this: (the canvas is the builder of html [and javascript])
renderContentOn: canvas
canvas form
class: 'eventEditor';
with:[
self renderWhoOn: canvas;
renderButtonsOn: canvas]
In this method, I call two subroutines
renderWhoOn: canvas
self decorateDivAndLabel: 'Who' on: canvas around: [
canvas select
id: tagId;
selected: model who;
list: model whoList;
callback: [:value | model who: value]]
The first one calls a decorator around a select form element:
decorateDivAndLabel: aString on: canvas around: aBlock
canvas div: [
canvas label
for: (tagId := canvas nextId);
with: aString,':'.
aBlock value]
This allows eliminating almost all duplication.
There is something related - SharpDOM - it is C#-based internal DSL. You can use it with ASP.NET MVC as well as outside of it. Right now it supports only generating of HTML, the next release is going to have CSS support too.
I am not familiar with Seaside , but you can use many different view engines with ASP.NET MVC, e.g., NHaml. Perhaps you can evaluate those and see if one would fit your needs.
You can also create your own view engine.
I have similar feelings about template systems (see ASP.MVC: Implementing a non-templated view engine?), and after experimenting a little, I took the following approach:
Some of the benefits (from my perspective):