views:

768

answers:

3

I have an HtmlTextArea and I want to restrict the number of characters users can input to 500.

Currently I've used a RegularExpressionValidator...

RegularExpressiondValidator val = new RegularExpressiondValidator ();
val.ValidationExpression = "^.{0,500}$";
val.ControlToValidate = id;
val.ErrorMessage = "blah";

... this is fine when the text is entered on a single line but it instantly fails validation whenever the text includes a new line character (ie. is multi-line).

I realise there are different regular expression engines and I need to test with the .NET one (can anyone point me in the direction of a good one online?) but I've tried a couple of other things including prepending "(?m)" to my expression string, and replacing ^ and $ with \A and \Z but so far no luck.

A further related question, can I avoid using a regular expression at all and link this validator to my own validation function somehow?

+3  A: 

the "." does not include new lines.

^((.|\n){0,500})$

This page might also help, its a regex cheat sheet.

ccook
You need to use parens instead of brackets. Brackets indicate Or but you added the | in their as well.
JaredPar
Yea, i immediately updated it after I realized I had done that.
ccook
I thought about it some more and I believe it would still have worked. The | in that case was just superfluous. I can't 100% remember though if \n in a [] is treated as 2 characters or a newline escape.
JaredPar
I don't think it would work... at least it hasn't for me in php and .net. You were right :)
ccook
+5  A: 

Change your regex to the following

"^(.|\n){0,500}$";

The . character matches everything except a newline. The or clause will fix your problem.

JaredPar
+1  A: 

I would do this in two ways, if you know javascript and want to restrict the client side character length you could do it with jQuery (a popular javascript extension library).

$(document).ready(function(){
  var $TextBox = $("#<%=TextBox.ClientID %>");

  $TextBox.keyup(function(){
     return $TextBox.length <= <%=TextBox.MaxLength %>;
  });
});

Then do a similar check server-side with a Custom Validator or in your button click method.

There are also ways to enable and disable ASP.Net Validators with javascript so you could look into that as well.

hunter
Interesting, but don't you lose the 'completeness' of the control? That is, half of the validation is in the server side validator, while the other half is in the page?
ccook
you're solution is obviously the most elegant. I just thought I would throw out an alternative. I have ASP.Net Validators for some things.
hunter