Email model validation with DataAnnotations and DataType
C#asp.net MvcValidationEmailModelC# Problem Overview
I have following model:
public class FormularModel
{
[Required]
public string Position { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
public string Webcode { get; set; }
}
Required validation works fine. But when i try with DataType it doesn't react.
Here is my razor code for the email control:
@Html.TextBoxFor
(model => model.Email,
new { @style = "width: 175px;", @class = "txtField" }
) *
So, anyone know an answer?
TIA
C# Solutions
Solution 1 - C#
DataType
attribute is used for formatting purposes, not for validation.
I suggest you use ASP.NET MVC 3 Futures for email validation.
Sample code:
[Required]
[DataType(DataType.EmailAddress)]
[EmailAddress]
public string Email { get; set; }
If you happen to be using .NET Framework 4.5
, there's now a built in EmailAddressAttribute
that lives in System.ComponentModel.DataAnnotations.EmailAddressAttribute
.
Solution 2 - C#
The DataAnnotationsExtensions project has an Email attribute that you can use.
Solution 3 - C#
I have looked at the source code (reverse engineered by Reflector) and DataType
variants are actually not even implemented! (This was for DateType.Date
)
So it is not going to work.
I would personally use RegexValidation
for email.
For clarity, here is the implementation of IsValid
in class DataTypeAttribute
:
public override bool IsValid(object value)
{
return true;
}
Solution 4 - C#
I used this regex pattern which will allow some of the newer longer extensions (.mynewsite, etc).
@"^[\w-_]+(\.[\w!#$%'*+\/=?\^`{|}]+)*@((([\-\w]+\.)+[a-zA-Z]{2,20})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$"
Not Valid, among others too:
- email@com
- email-o'[email protected] <-- doesn't like the tick, oh well.
Examples that work:
Solution 5 - C#
I think you need to add at html code one componente Html.ValidationMessageFor
. This component shows the validation.
The code may be (using razor):
@Html.TextBoxFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
try it.