I have this ViewModel
public class CustomerSuscribeViewModel : IValidatableObject
{
[DataMember(IsRequired = true)]
[DataType(DataType.Text)]
public string Name { get; set; }
public string SurName { get; set; }
[DataMember(IsRequired = true)]
[DataType(DataType.Password)]
public string Password { get; set; }
[DataMember(IsRequired = true)]
[DataType(DataType.Password)]
public string ConfirmPassword { get; set; }
[DataMember(IsRequired = true)]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Inject]
public IDataUsers DataUsers { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if(DataUsers.Get(new UserFilter() {Email = Email}).Any())
{
yield return new ValidationResult(This Email is already used.",new string[]{"Email"});
}
if(ConfirmPassword != Password)
yield return new ValidationResult("Please confirm your apssword", new string[] { "Password", "ConfirmPassword" });
}
}
and this action
[HttpPost]
public ActionResult Suscribe(CustomerSuscribeViewModel customer)
{
if (!ModelState.IsValid)
return View(customer);
The problem is the member DataUsers is never created, so I get a NullReferenceException.
The binding is done by :
Bind<IDataUsers>().To<DataUsers>();
Any Idea ?
EDIT : The InjectAttribute works well for properties inside my controllers.
Environnement : asp.net mvc 3 , ninject 2.2 (maybe I need to update ?)
View Models are not created by Ninject so the inject attribute is ignored. Usually view models should be kept simple and have no dependencies. You can get there by using
ValidationAttributes instead ofIValidatableObjectRead https://github.com/ninject/ninject.web.mvc/wiki/Injection-of-validators about injection of validation attributes.
Here is an example of how one can achieve the validation of the password vs confirmation password matching using a
ValidationAttribute: