6

came across an issue with validation of complex classes in ASP.NET MVC4 using DataAnnotation.

Let's have a following model (simplified)

public class Customer
{
   [Required]
   [StringLength(8, MinimumLength = 3)]        
   public string UserName { get; set; }

   [Required]
   [StringLength(8, MinimumLength = 3)]
   public string DisplayName { get; set; }
}


public class Order
{
    public Customer customer { get; set; }
}

Then I try to validate an instance of this model in my controller:

// CREATE A DUMMY INSTANCE OF THE MODEL 
Customer cust = new Customer();
cust.UserName = "x";
cust.DisplayName = "x";

Order orderModel = new Order();
orderModel.customer = cust;

// VALIDATE MODEL
TryValidateModel(orderModel); // ModelState.IsValid is TRUE (which is incorrect)
TryValidateModel(cust); // ModelState.IsValid is FALSE (whic is correct}

Validation of orderModel should fail as the cust.UserName has only 1 character, but 3 are required by the Model. Same applies to cust.DisplayName. But when I validate a pure Customer class then it fails as expected.

Any idea what's wrong?

thanks

Jiri

2
  • 1
    As far as I know you can't validate nested objects like that, maybe use a custom validator Commented Aug 30, 2012 at 13:20
  • 1
    It seems data annotation validation doesn't run validation of nested objects by default. Simmilar post here stackoverflow.com/questions/2493800/… Commented Aug 30, 2012 at 13:30

1 Answer 1

2

DataAnnotations won't dig into your objects on it's own. You have two choices:

1--Write a custom validator to check child properties

2--Create a view model with populated with the simple properties decorated with data annotations

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.