I am working on rendering a dynamic form in an ASP.NET MVC view that will meet these requirements:
- Fields can be validated
- State is preserved when the form is invalid
I am looking into creating a custom model binder to achieve this. I am generally planning to do this:
- Form fields are defined with these properties
- Prompt (label next to fields)
- Type (text, checkboxlist, radiolist, etc.)
- Choices (for list fields)
- IsRequired
- RegularExpression (for text fields)
- Display Options
- Collection of field definitions are sent from the controller to the view
- Fields are rendered into HTML and sent to the browser
- Form is sent back to the server
- A custom model binder binds the form to a collection of field definitions that now contains the submitted values
- Each field is validated
- If required -> must have a value
- If RegEx -> must match
- For each invalid field, an error message is added to modelstate
- The controller decides what to do
- If all fields are valid
- Do whatever with the fields and their values
- If 1 or more fields are invalid
- Send the collection of fields back to the view
- Render the fields again, with their previously attempted values
- Show the validation summary
I'm not sure if I am doing this in the best or easiest way. Will this approach give me a lot of problems or even work? What can I do to improve upon it?
I wrote a class library that basically does exactly what my psuedocode in my question describes. It works great.
EDIT:
I finally got around to cleaning up my class library. I have added some new features and created a fairly well documented demo web application.
All of this is hosted here on CodePlex. I hope this helps someone.