This one's quite common. You asynchronously communicate (a.k.a. Ajax) with your server and get JSON data in return. You most probably use $.parseJSON()
on the client side which actually parses JSON string and returns an object. We've all used that. But (yes, there's always a but) there's a catch. There's no defined standard for date serialization, so jQuery will not parse your dates back to dates. What the heck even native JSON parser (these days supported in all major browsers) won't do that. So you have to do it yourself. Manually. Or, modify default jQuery functionality a bit and get it done automatically.
Living in the coded world where bugs are inevitable and success is only optional. By Robert Koritnik
Google analytics script
Latest jQuery CDN with code tiggling.
Monday, 27 December 2010
jQuery parseJSON automatic date conversion for Asp.net and ISO date strings
Tuesday, 14 December 2010
Custom action method selector attributes in Asp.net MVC
Some of the least customized but very useful extension points in Asp.net MVC are action method selector attributes. We use them all the time without actually knowing, but we may write our own as well and make seemingly complex things trivial.
A real world example
Take for instance Twitter website. When you first visit their site, you are presented with the anonymous visitor home page that provides search capabilities, trends etc.
But when you're logged in you see a completely different page. Web address is still the same, but content is completely different. You see your home twitter page where you can send tweets and read your stream.
Using custom action method selector attributes, you can easily differentiate between such requests without using multifaceted controller actions.
Friday, 10 December 2010
Sending complex JSON objects to Asp.net MVC using jQuery Ajax
jQuery has great support for sending HTML form data (that is input
, select
and textarea
element values) back to the server using Ajax technologies by providing two main ways of preparing form data for submission - namely serialize()
and serializeArray()
functions. But sometimes we just don't have a form to send but rather JSON objects that we'd like to transfer over to the server.
Asp.net MVC on the other hand has built-in capabilities of transforming sent data to strong type objects while also validating their state. But data we're sending has to be prepared in the right way so default data binder can it and populate controller action parameters objects' properties. We can of course parse values ourselves but then we also loose the simplest yet efficient built-in validation using data annotations which is something we definitely want to use.
I know I've been sending JSON objects back to the server before, but this time I came across a problem that felt odd, since based on my previous experience should work out of the box. To my surprise it didn't. Let me explain what was going on.
Friday, 19 November 2010
Handling validation errors on Ajax calls in Asp.net MVC
If you're developing rich web clients using Asp.net MVC on the back-end, you've probably come across this functionality that can be described with these conditions:
- client side data (may be a form),
- ajax posting of this data (form),
- controller action has strong type parameters,
- controller action processes data and returns anything but a full view (since it was an Ajax call)
Seems fairly straight forward, right? Well not so fast my fellow developer friend...
Thursday, 4 November 2010
Running batch files (*.bat) inside Visual Studio
This is something very simple, but very useful. Something Microsoft should've put in Visual Studio in the first place long ago. When I develop data-aware applications I usually end up writing database scripts to make it easy to (re)deploy and version control my database model. I usually write several files just to make things controllable and manageable. But deploying them is a different task altogether. And a tedious one as well. I have to fire up SQL Management Studio and then run all those scripts in correct order. Since this is done rather frequently during application development it seems like a very good candidate for automation or simplification. So let's do just that.
Wednesday, 3 November 2010
T4 template to generate BLToolkit compliant stored procedure calls
Developing data aware applications used to be quite a pain before various helper libraries emerged. At first we used Enterprise Library from Microsoft that made things much simpler and standardized. In all the years of development it became very complex or even too complex for usual everyday projects. Anyway. Lately we started using more popular OR/M tools and libraries that go even further and provide a really transparent abstraction layer between our logic and the actual data store (whichever it may be).
Choosing DAL layer technologies isn't always straight forward. You have to choose wisely and think of the scenarios you'll use in your application. The same thing happened to me this last time when I was at the same decision point. Yet again.
I've used Entity Framework on two past projects (using EF Extensions along with it to make it simpler to integrate custom occasional stored procedures). Contrary to popular belief I was quite pleased with it even though we had to resort to not so seldom hacks to make it snappy. Usually provided by stored procedure calls and result materialization. Nonetheless it worked as expected. We still didn't have to write any entity classes, connection lifetime was auto-managed in entity context as well. Entity Framework FTW so to speak. On the downside I should as well mention that speed is not its strength. You use SQL Profiler quite often to analyse those all but easy to grasp spaghetti T-SQL queries. But things have greatly improved after EF4 was released. Visual Studio integration was of course one of its best strengths that gives you the all familiar drag and click UI without writing XML files. Even though it wasn't fully working in version 1.
Custom complex stored procedures aren't OR/M friendly
But this time I knew this application will be much heavier on the database side with much more complex processes and larger amounts of data. All these will most probably be better processed by stored procedures in the database itself. So I ruled out Entity Framework completely because I would be writing lots of custom materializers and such. But what should one choose instead? Most of these days OR/M libraries don't support custom stored procedures quite well, so I had to rule out LINQ to SQL, NHibernate, Subsonic and similar as well. I'd use Fluent NHibernate anyway since I prefer syntax checked code over XML configuration.
BLToolkit library to the rescue
So I resorted to semi-biased ORMBattle.NET website that lists most popular OR/M libraries along with their measured benchmarks. My main requirements for my DAL layer library were:
- support for all kinds of custom stored procedures and
- automatic result materialization and of course
- it had to be free
The good thing is that BLToolkit is fast and provides data materialization. But the bad thing is that you may end up with lots of magic strings. This is where T4 comes into play. I wanted to avoid writing stored procedures' names and parameters using plain strings, because that's very prone to human errors. Not to mention tedious work and updates when something gets changed on the DB side.
Database side
To make things more generic and structured I had to stick to certain syntax rules on the database side. I didn't want to end up with a single class that has as many methods as there are stored procedures in the database. Certain stored procedures are related to certain common tables, that are usually reflected in some middle layer entity class. For instance if we have a table Person
we will have several stored procedures that will manipulate data around this table and related ones as well. But basically these stored procedures will be somehow related to the Person
database table. We usually name stored procedures that way. At least most of the time:
Person_GetAll
Person_SaveRelatedData
- etc.
The usual stored procedure call in BLToolkit
If you haven't used BLToolkit before, let me get you up to speed and show you some code, that makes it easy to understand how to execute a parametrised stored procedure call.
1: using (var db = new DbManager())
2: {
3: return db
4: .SetSpCommand(
5: "Person_SaveWithRelations",
6: db.Parameter("@Name", name),
7: db.Parameter("@Email", email),
8: db.Parameter("@Birth", birth),
9: db.Parameter("@ExternalID", exId))
10: .ExecuteObject<Person>();
11: }
Person
table) and then executes a SELECT
statement as well to return the newly created record (with relations if necessary).
As you may see, this is a very easy and comfortable way of calling stored procedures (can easily call regular queries as well) and having results materialized along the way. But. The problem lies right there in front of our eyes. Magic strings.
What if we make a typo?
What if we slightly rename a stored procedure?
What if we add a few others?
What if we rename a parameter or its type?
But the main one is what if we're part of a larger team where each developer's writing a separate part of application and not everyone is tedious or/and communicative?
The answer to all these questions is use automation. So let's automate generation of our stored procedure calls with strong typed parameters. The most obvious way of doing this is by using Text Transformation Template Toolkit or in short T4 because it's very well integrated into Visual Studio and works really well. If we use extensions like Tangible T4 editor we get nice code highlighting and intellisense support along the way as well.
Stored procedure call after using T4 template
What we'd like to achieve in the end is to get previous code to be called this way:
1: using (var db = new DataManager())
2: {
3: return db
4: .Person
5: .SaveWithRelations(
6: name,
7: email,
8: birth,
9: exId
10: )
11: .ExecuteObject<Person>();
12: }
Gimme gimme gimme code
You can download T4 template from Google code site. There's a comment header at the top of the template where you'll find all instructions how to use the template. For now all stored procedures are treated the same. These will probably be next extensions to this template:
- Support for output parameters
- Handling multi result set stored procedures - there will have to be some naming convention to distinguish these and template will either have to provide some sort of support or skip generation
- etc.
I'm attaching template comment head here so you can provide some input whether it's readable (just add a comment to this post):
1: /* BLToolkit stored procedure calls T4 generator */
2: /* ------------------------------------------------------ */
3: /* 1. Fill in variables below this comment head */
4: /* 2. Stored procedures must use this notation: */
5: /* ie. "Person_SaveWithRelations" */
6: /* which will generate: */
7: /* - a class PersonClass */
8: /* - a property DataManager.Person of type PersonClass */
9: /* - an instance method Person.SaveWithRelations() */
10: /* - method will have strong typed parameters */
11: /* 3. Save template and use code */
12:
13: // set your preferred DbManager inherited class name (ie. class DataManager: DbManager { ... })
14: string className = "DataManager";
15: // provide namespace of your class
16: string useNamespace = "ApplicationName.Data.General";
17: // provide DB connection name (from .config file) that will be used by your DB manager
18: string dbConnectionName = "DefaultDatabaseConnection";
19:
20: // provide DB connection string that will be used by this generator
21: string connection = "Data Source=.;Initial Catalog=somedb;User ID=someuser;Password=somepassword";
22:
23: /* That's it. Save this file now. */
Provide some feedback
If you have any additional ideas how to enhance or change this template I'm willing to consider your ideas. You can easily provide code snippets that would make it even better. Anyway. I hope you'll use it and that you'll like it.
Thursday, 9 September 2010
Asp.net MVC model binding to List<T>
Asp.net MVC is really a great platform to build performant and very controllable web applications. But sometimes some functionality is scarcely documented if at all. Internet proves (thank you Google) to be an invaluable wealth of information in this regard since other developers are usually solving similar problems. But sometimes you either don't find usable information or you want to test things for yourself as well and learn something new as you go along.
Something similar happened to me on my previous project. I had to dynamically generate a list of objects in the browser and then reliably POST them back to web server so that data would be reliably model bound and validated as well. I wanted to avoid manual validation at all costs because it would unnecessarily overcomplicate server code.
Wednesday, 18 August 2010
Writing a custom IHttpModule that handles Application_OnStart event
If you've been developing Asp.net web applications you've probably come across the IHttpModule
interface, that makes it possible to write reusable request-level event handlers. The same thing can of course be done by writing event handlers inside the Global.asax
codebehind, but then you wouldn't be able to reuse the same code unless you do a copy/paste.
But Global.asax
codebehind has one particular advantage over your custom modules: it can also attach to application-level events like application start event for instance. As per documentation, this is not possible with a custom module. Or so I thought...
Tuesday, 17 August 2010
// I need my own blogpublic void Blog_Start(object sender, EventArgs e){…}
Blogs have been around for a long time (at least by others), but until recently I haven't really given it a serious thought of starting my own. I simply didn't really know what to write about and I would spectacularly fail in writing my own memoires or something similar.