I’ve created error handling and states exactly as you show in your example; outline the input field in red and show an error message below it. I typically don’t use dynamic panels, but I also haven’t seen performance differences with dynamic panels. I’ve had pages with dozens of input fields which have worked quite well.
I would love to have a built-in Error or Selected state for input fields, and I know this request has been received and considered by Axure. Because the “Forms” widgets are “standard HTML” they are for the most part styled and handled by the browser. So, my basic approach has a group of three widgets for every user input field: a text field, a box widget behind that field to serve as the border, and a widget for the error text, just below or above the border and hidden by default.
The box widget behind the input field is larger than the input field—just enough to show its border. (Or you can set the input field to no border and no fill.) I use the box widget’s selection state for the normal and error styling (selected state has red border.) In its OnSelected event, I have a “Show errorText” and in OnUnselected “Hide errorText”. In the input field’s OnTextChange or OnKeyUp event (or in another “submit” button) I have a series of conditions to test for errors. If an error, it sets the text for that field’s errorText widget and set the border widget to selected.
I’ve also used this “group of 3” approach in a repeater for long surveys or chat simulations with success. You can also create one of these as a Master and/or a custom library widget for easy reuse.