There’s a few things to consider when validating data from a rich textarea. After setting it up (here’s a blog post about that), we have to allow the property to accept HTML, otherwise, you’ll get this:

Which would normally be good a thing for normal textboxes to avoid XSS. However, here we have to accept it. So assuming we have a property in our model called message, we add the AllowHtml attribute:

[AllowHtml]
public string Message { get; set; }

This is all great and dandy, however, once you do that, it won’t allow other validations, like Range(). So what we have to do is create our own attribute. To do this, we just create a class that inherits ValidationAttribute:

The problem with this set up is that we don't want HTML tags to count as characters. So we need to parse out HTML. Because parsing data with just one regular expression can be error-prone, it's best to use a library like HTML Agility pack – get it from NuGet:

Once you have it installed in your project, we can reuse the sample code parse out HTML from its CodePlex site.

For simplicity’s sake, I made the class and its methods static. Additionally, I added the following method to add additional scrubbing logic:

We're overriding the FormatErrorMessage method so we can customize the error message to show the min and max values of the range. Also, we need to set min and max as public properties so we can use it as arguments as part of the AllowHtmlRangeLength attribute. So this is how it's called now:

I’ve recently gotten a chance to try out Dapper – a micro ORM library by Sam Saffron, which originally spawned from StackOverflow’s codeset. If you’re looking for an extremely light-weight library to access your SQL Server, I highly recommend it. It focuses more on convention than configuration. It also does not have the overhead that EntityFramework or NHibernate have, and it emphasizes speed and ease-of-use.

Dapper is a collection of Extension Methods that enhance the Connection object (or rather extends the IDbConnection interface). It also embraces the use of inline SQL in your code, which is useful when retrieving sets that are less trivial. With its buddy, Dapper-Extensions by Thad Smith, it makes DB interaction even easier.

Both of these libraries can be downloaded from NuGet, and you’ll need them to run the following code.

There’s really just one thing that I found irritating about the Dapper project: the documentation. While there is documentation found at its Google Code home page, I find it very lacking.

Anywhoot, to get started first we need to create our table. Once we have that and add some data, we’ll use the Dapper to extract the data and map to objects.

OK, so there’s nothing out of the ordinary here. We’re creating the class we want to map our data to, creating a Connection object, opening, closing, and then disposing (via using). Now let’s suck up some data within our Main() method:

That should give us the count. To see how the data types were mapped, we can take a look at the Dapper source code, SqlMapper.cs inside the static method SqlMapper(). For reference, you can take a peek at these two sources to understand SQL Server/CLR/.NET framework data types:

Mismatches and Nulls

In the query that we ran, we were making the assumption that all columns in the db match all the properties in the class. What if we have a mismatch? What if we have this?

IEnumerable customers = conn.Query("SELECT LastName FROM Customer");

Notice that we’re only retrieving the LastName, while we have other properties in our Customer class. Well, this is what you would see:

So from the above, we notice that Dapper will handle Nulls by:

Setting strings as Nulls

Setting a Guid to 00000000-0000-0000-0000-000000000000

Setting an int to 0

Setting bool to false

Setting a DateTime to 1/1/0001 12:00:00 AM

Which will all happen when Dapper cannot find a class property to map to from the column value. Also, if you column name that DOES NOT match a property, it will throw a SqlException of “Invalid Column Name”.

Parameterization

What if we want to pass a parameter into our SQL? Let’s pass a parameter:

// The second @ token does not have to be named "@IsAllowed" and can be named anything as
// long as the C# property in the anonymous object is named the same thing.
IEnumerable customers = conn.Query("GetCustomers @IsAllowed = @IsAllowed", new { IsAllowed = 33 } );

Sample #1: Binding to a List<string>

There’s a few ways to model bind a collection to a dropdown using the DropDown HTML helpers in ASP.NET MVC. Let’s first look at a simple scenario, where we have a dropdown and we want to bind to a List of states.

For this example, we’re going to construct a class called Globalization that has the list of states. (I use an this object to hold look-up data sets.)

So we write the C# code a little different for this scenario. I’ve found that for this, it’s helpful to use the helper @Html.DropDownListFor(), which accepts an IEnumerable, which you’ll have to construct.

I wanted to share this sample project I put together that demonstrates model-binding and validation of several form components, including complex ones such as dropdowns, checkboxes, and radio buttons. There are several aspects to think about when submitting a form:

HTML form value has to map to the correct C# property/object via Model Binding.

Value submitted has to be properly validated based on Attributes or logic in controller.

If the form has invalid data, the form has to refresh itself and be populated with all the values the user previous attempted to submit.

The appropriate error messages have to be displayed next. The error messages can be part of the set of attributes above the property or handled via ViewBag/ViewData object.

The following example has all that. It also uses a ViewModel (BankAccount.cs) to piece together the main Business Domain Models (e.g. Person).

Now, if you’re using Chrome, and you view this page, Chrome will try to request for favicon.ico, which is not delivered from this web page. So, you have to write a filter in your web.config to ignore the .ico file:

Kooboo is a CMS based on ASP.NET MVC. Recently, I got a chance to take it for a spin, and here are some of my thoughts. Keep in mind that the drawbacks here may come just from my ignorance of the tool use. :) I’ll update this as the more I learn about the inner workings.

Benefits

Admin Panel’s UI is intuitive for designers/programmers

Easy to add pages

Easy to add your own themes/styles

Easy to create your own type of content

Easy to add content

Lots of Features, more than Orchard

Mature, has been around for a while (2008)

Views are coded in Razor

Can connect to MongoDB and other datasource types

Versioning of any piece of content and view differences

Manage website resources easily – images/documents/etc.

Drawbacks

May not be a drawback once I figure out the “how” and get better understanding.

Once a site is created, when I migrated from XML to MongoDB, I lost all the website data from the XML files.

Admin Panel’s UI may not be intuitive to non-designers/programmers.

Site directory structure Kooboo generates is not the same as the traditional ASP.NET MVC.

Let’s take a look. For a site I created using Kooboo, named “batman”:

When a content type is created, it does not create a C# class file. (I didn’t see one at least, in the directory structure.) It does, however, create a MongoDB collection for the content, there’s just no C# class mapped to it.

There’s no clear way to bind a View to a model class as in traditional ASP.NET MVC since, Kooboo doesn’t create a C# class file. It doesn’t follow the traditional file/folder naming convention: for each View, you map that to a model.

Community not as large as other CMS communities (Orchard, Umbraco, DNN).

During a job hunt, I compiled a list of companies that use ASP.NET. Most of them, without a surprise, are big corporate ones. Also, not all of them use ASP.NET exclusively for their entire site/business. Many of these sites have subsites for their many divisions, so a mix of technologies are used.