Email model validation with DataAnnotations and DataType

C#asp.net MvcValidationEmailModel

C# 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:

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionlifeofbenschiView Question on Stackoverflow
Solution 1 - C#Leniel MaccaferriView Answer on Stackoverflow
Solution 2 - C#jrummellView Answer on Stackoverflow
Solution 3 - C#AliostadView Answer on Stackoverflow
Solution 4 - C#RichieMNView Answer on Stackoverflow
Solution 5 - C#WmanuelcrView Answer on Stackoverflow