The problem here was that a CSS rule, recently applied, was overriding the in-line asp.net in-line styles. This meant that validation was in fact working correctly, but as the in-line style="display: none" was overridden, the validation messages were constantly showing.
This only affected required field validators as these had a different CSS class applied to other validators. Another entirely unrelated issue with a URL rewriter specific to the site was preventing the form from submitting, which confused the issue further. Thanks for your help, anyway.