A critical vulnerability was discovered in React Server Components (Next.js). Our systems remain protected but we advise to update packages to newest version. Learn More

crli
Nov 16, 2010
  5762
(3 votes)

Spark View Engine on WebForms

Spark view engine is a neat little web utility that allows you to write code like this:

<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
  <li each="var p in products">${p.Name}</li>
</ul>
<else>
  <p>No products available</p>
</else>

If your eye skipped over it because it looks just like html I wouldn’t blame you. But look again. Loops and conditions are nicely embedded in html. Spark really does let the html dominate (which can be a good thing). These are but a few of all the nice features. If you have them, spend a couple of minutes browsing the spark documentation to learn what’s more.

To learn a bit about the inner workings of this wonderful tool I set out to add WebForms support. The spark codebase has a very testable design and can be coerced to help out in a WebForms control without modification. The end result look like this:

<spark:View runat="server">
  <ul if="Container.GetProducts().Any()">
    <li each="var p in Container.GetProducts()">${p.Name}</li>
  </ul>
  <else>
    <p>No products available</p>
  </else>
</spark:View>

Download and usage

To use it download

and unzip into your bin folder.

Register the control in web.config:

<pages>
  <controls>
    <add tagPrefix="spark" namespace="Spark.Web.Forms" assembly="Spark.Web.Forms"/>

Add something useful to iterate over to your page or user control:

public string[] Values;
protected void Page_Load(object sender, EventArgs e)
{
  Values = new string[] { "Simple", "As", "Pancake" };
}

And add the spark control:

<spark:View runat="server">
  <ul>
    <li each="var c in Page.Values">${c}</li>
  </ul>
</spark:View>

Future improvement ideas

Some features are definitely missing (and they might require modification of the spark code itself):

  • Spool content from a spark view controls placed later in the control tree
  • Cache the compiled views
  • Support the spark cache element

The code is over here.

Nov 16, 2010

Comments

Nov 16, 2010 10:17 PM

Its good to see the new rendering engines coming out. This looks promising but so does Razor - who will win :)!

Magnus Rahl
Magnus Rahl Nov 17, 2010 08:10 AM

Is it possible to use Razor with WebForms?

Nov 17, 2010 08:54 AM

Awesomesauce Cristian!

Nov 17, 2010 10:31 AM

@Magnus On Scot Gu's blog he says to "watch this space" when talking about Razor with classic web forms. Not sure when that will be though!

Magnus Rahl
Magnus Rahl Nov 17, 2010 01:20 PM

Thanks David! Maybe I'll go with Spark for now then, it is indeed nice to be able to do loops etc, and to do it without butt ugly syntax.

Nov 17, 2010 01:50 PM

@Magnus, is there a particular feature from Razor that you're missing in sparks?

Magnus Rahl
Magnus Rahl Nov 17, 2010 07:03 PM

@Stefan, no just curious :)

Deane Barker
Deane Barker Nov 18, 2010 02:56 AM

For one client, we actually allowed them to have Spark code in an EPIServer XHTML property. When the page rendered, a Page Adapter executed the Spark markup, so they could alter the HTML output down to the single word or sentence based on external criteria.

Nov 24, 2010 06:39 PM

Awesome work! I would really love it if you would continue improving this as I think this could be extremely useful, especially combined with MVP.

Please login to comment.
Latest blogs
Looking back at Optimizely in 2025

Explore Optimizely's architectural shift in 2025, which removed coordination cost through a unified execution loop. Learn how agentic Opal AI and...

Andy Blyth | Dec 17, 2025 |

Cleaning Up Content Graph Webhooks in PaaS CMS: Scheduled Job

The Problem Bit of a niche issue, but we are building a headless solution where the presentation layer is hosted on Netlify, when in a regular...

Minesh Shah (Netcel) | Dec 17, 2025

A day in the life of an Optimizely OMVP - OptiGraphExtensions v2.0: Enhanced Search Control with Language Support and Synonym Slots

Supercharge your Optimizely Graph search experience with powerful new features for multilingual sites and fine-grained search tuning. As search...

Graham Carr | Dec 16, 2025

A day in the life of an Optimizely OMVP - Optimizely Opal: Specialized Agents, Workflows, and Tools Explained

The AI landscape in digital experience platforms has shifted dramatically. At Opticon 2025, Optimizely unveiled the next evolution of Optimizely Op...

Graham Carr | Dec 16, 2025

Optimizely CMS - Learning by Doing: EP09 - Create Hero, Breadcrumb's and Integrate SEO : Demo

  Episode 9  is Live!! The latest installment of my  Learning by Doing: Build Series  on  Optimizely Episode 9 CMS 12  is now available on YouTube!...

Ratish | Dec 15, 2025 |

Building simple Opal tools for product search and content creation

Optimizely Opal tools make it easy for AI agents to call your APIs – in this post we’ll build a small ASP.NET host that exposes two of them: one fo...

Pär Wissmark | Dec 13, 2025 |