My forms have inputs with default helper text that guides the user on what to enter (rather than using labels). This makes validation tricky because the input value is never
Yes thats the right way to go. You should implement your own atribute and implement IClientValidatable.
IClientValidatable
You could also have a required boolean value set initially to false as a hidden form field. When the user changes the textbox, set it to true.
false