Replace jQuery Validation Message Formatting with ASP.NET AJAX String.format()

I’m working on a site where we’re using both ASP.NET AJAX and jQuery to get things done. This includes jQuery Validation for client-side validation functionality.

One of the things that comes with jQuery Validation is a $.validator.format method that replaces the {n} style parameters in a string with arguments - basically, a very lightweight String.format.

ASP.NET AJAX provides a really nice implementation of String.format that is pretty full-featured and understands format strings. For example, you can do String.format(“{0:d}”, mydate) to format a date in short date format. Snazzy stuff. Unfortunately, the jQuery Validation one isn’t that robust… so I figured I’d marry the two worlds. Allow you to still use the $.validator.format method, just like you always do, but under the covers it’ll pass through to ASP.NET AJAX to do the replacement/formatting.

Make sure you’ve got the ASP.NET AJAX, jQuery, and jQuery Validation script libraries registered in your page, then do this:

(function($) {  if ($.validator) {    $.validator.format = function(source, params) {      if (arguments.length == 1)        return function() {          var args = $.makeArray(arguments);          args.unshift(source);          return $.validator.format.apply(this, args);        };      if (arguments.length > 2 && params.constructor != Array) {        params = $.makeArray(arguments).slice(1);      }      if (params.constructor != Array) {        params = [params];      }      var toEval = "String.localeFormat(source, __);";      var paramEval = new Array();      for (var i = 0; i < params.length; i++) {        Array.add(paramEval, "params[" + i + "]");      }      toEval = toEval.replace(/__/, paramEval.join(","));      return eval(toEval);    };  }})(jQuery);

Basically we keep the currying bit that comes out of the box with $.validator.format but replace the bit that does the replacement work with the ASP.NET AJAX String.format. That should replace the existing $.validator.format method with a syntactically-and-functionally-equivalent, but slightly more robust, implementation.

UPDATE 9/30/09: The original version didn’t work if there was more than one parameter value you were validating against, like in a range where there’s a min and a max value. The new version takes that into account. The crazy eval junk at the end is because you can’t do String.localeFormat(“…”, Array) - the string formatting in ASP.NET AJAX doesn’t like it if you pass an array rather than an explicit list of arguments. The eval thing dynamically builds a valid statement like String.localeFormat(source, params[0], params[1]…, params[n]) and evaluates that so it works.