ASP.NET MVC Custom Validation by DataAnnotation
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.
Introduction
ASP.NET MVC supports validation through DataAnnotations, which lets you place validation rules directly on model properties. Built-in attributes cover many common cases, but custom validation becomes necessary when the rule is domain-specific. The usual way to do that is to create your own attribute by inheriting from ValidationAttribute.
Create a Custom Validation Attribute
A custom DataAnnotation starts by subclassing ValidationAttribute and overriding IsValid.
This attribute checks whether the given birth date satisfies the minimum age rule.
Apply the Attribute to a Model
Once the attribute exists, use it like any built-in DataAnnotation:
When model binding runs, MVC evaluates the attribute and adds validation errors to ModelState if the rule fails.
Check ModelState in the Controller
Custom attributes participate in the normal validation flow:
This is why custom DataAnnotations feel natural in MVC. They integrate with the same validation pipeline as Required, Range, and the other built-in attributes.
When Property-Level Validation Is Not Enough
Some rules depend on multiple properties rather than one field in isolation. For example, one date may need to be after another. In those cases, IValidatableObject is often a better fit than a property-level custom attribute.
This is often cleaner than forcing cross-field logic into a single-property attribute.
Server Validation Versus Client Validation
A basic custom ValidationAttribute gives you server-side validation automatically. Client-side validation is a separate concern. In classic ASP.NET MVC, extra work is required if you want the browser to enforce the same custom rule through unobtrusive validation.
That does not make the custom attribute incomplete. It just means you should be clear about where the rule is being enforced.
Common Pitfalls
One common mistake is putting cross-property logic into a property-level attribute when IValidatableObject would express the rule more cleanly.
Another mistake is assuming that a custom ValidationAttribute automatically produces client-side validation behavior. Server-side validation comes first; client-side support may require additional wiring.
Developers also sometimes return false or throw exceptions instead of returning a proper ValidationResult. A clear validation result makes the MVC pipeline behave predictably.
Finally, remember that null handling is a design choice. If the field must be present, combine your custom attribute with Required instead of making the custom attribute responsible for every possible rule.
Summary
- Custom MVC DataAnnotation validation starts by inheriting from
ValidationAttribute. - Apply the custom attribute to model properties just like built-in validation attributes.
- MVC adds validation failures to
ModelStateautomatically during model binding. - Use
IValidatableObjectwhen the rule depends on multiple properties. - Server-side validation is automatic; client-side custom validation usually needs extra setup.
Related reading
- ASP.NET MVC Global Variables
- ASP.NET MVC Hidden field value does not get rendered using HtmlHelper.Hidden
- ASP.NET MVC HTML helper methods for new HTML5 input types
- ASP.NET MVC Is Controller created for every request?
- ASP.NET MVC OutputCacheAttribute with external cache providers
- ASP.NET MVC Razor pass model to layout
- ASP.NET MVC Razor render without encoding
- ASP.Net MVC Redirect To A Different View

OOD Fundamentals
Master object-oriented design from first principles, SOLID, design patterns, and classic interview problems with hands-on coding.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.