the method I like to use is this (this is in the context of an MVC application)
- Form in a View is set to POST back to own URL.
- When the controller receives a POST request, validation is performed. If errors aren't found, the relevant action is taken, and then a HTTP redirect is sent back to the browser to send them to correct "success" page.
- If validation fails, the original form is displayed, and each field displays the entered data. Invalid fields show error messages.