Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I show a different Required message to instances of the same object in MVC3?

I have a Razor MVC3 project which has two user records in a form, one for the key contact and one for a backup contact. For example;

public class User
{
    [Required(ErrorMessage = "First name is required")]
    public string FirstName { get; set; }
}

Validation all works well except for the small issue where the user fails to fill out a field, it says 'First name is required' but I'd like to point the user to which one of the first name fields is missing. Such as 'Backup contact first name is required' or 'Key contact first name is required'.

Ideally I'd like to leave the [Required] annotation on the class as it is used elsewhere.

This seems like one of those small cases that might have been missed and is not easily achieved, but please prove me wrong.

Ryan

like image 819
Ryan O'Neill Avatar asked May 02 '11 16:05

Ryan O'Neill


2 Answers

One way you can accomplish this is with a separate view model for this screen, instead of a single User model with all the error messages. In the new view model, you could have a BackupContactFirstName property, KeyContactFirstName property, etc each with its separate error message. (Alternatively this view model could contain separate User models as properties, but I've found that Microsoft's client validation doesn't play well with complex models and prefers flat properties).

Your view model would look like this:

public class MySpecialScreenViewModel
{
    [Required(ErrorMessage = "Backup contact first name is required")]
    public string BackupContactFirstName { get; set; }


    [Required(ErrorMessage = "Key contact first name is required")]
    public string KeyContactFirstName { get; set; }
}

Then pass your view model to the view like this:

@model MySpecialScreenViewModel
...

Your post controller action would collect the properties from the view model (or map them to separate User models) and pass them to the appropriate data processing methods.

like image 140
Robert Corvus Avatar answered Oct 22 '22 04:10

Robert Corvus


An alternative I have stumbled across, just modify the ModelState collection. It will have the elements in a collection named by index, like 'User_0__EmailAddress' and you can adjust / amend / replace the Errors collection associated with that key.

like image 42
Ryan O'Neill Avatar answered Oct 22 '22 04:10

Ryan O'Neill