3

I have a data validation class that checks whether the start date of a meeting is before the end date.

The model automatically passes in the date that requires validation, but i'm having a bit of difficulty passing the data that it needs to be validated against.

Here's my validation class

sealed public class StartLessThanEndAttribute : ValidationAttribute
    {            
        public DateTime DateEnd { get; set; }

        public override bool IsValid(object value)
        {                
            DateTime end = DateEnd;
            DateTime date = (DateTime)value;

            return (date < end);
        }

        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name);
        }
    }

Here's the class that contains the data annotations

[StartLessThanEnd(ErrorMessage="Start Date must be before the end Date")]
public DateTime DateStart { get; set; }

And here's my controller

[HttpPost, Authorize]
    public ActionResult Create(Pol_Event pol_Event)
    {
        ViewData["EventTypes"] = et.GetAllEventTypes().ToList();

        StartLessThanEndAttribute startDateLessThanEnd = new StartLessThanEndAttribute();


        startDateLessThanEnd.DateEnd = pol_Event.DateEnd;


        if (TryUpdateModel(pol_Event))
        {
            pol_Event.Created_On = DateTime.Now;
            pol_Event.Created_By = User.Identity.Name;

            eventRepo.Add(pol_Event);
            eventRepo.Save();
            return RedirectToAction("Details", "Events", new { id = pol_Event.EventID });
        }

        return View(pol_Event);
    }

1 Answer 1

3

Validation attributes that work with multiple properties should be applied to the model and not on individual properties:

[AttributeUsage(AttributeTargets.Class)]
public class StartLessThanEndAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var model = (MyModel)value;
        return model.StartDate < model.EndDate;
    }
}

[StartLessThanEnd(ErrorMessage = "Start Date must be before the end Date")]
public class MyModel
{
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}
Sign up to request clarification or add additional context in comments.

2 Comments

Great now how do I do that on in the GetClientValidationRules method for client side validation. I want to pass some property values to the client side validation rules.
Nice example of how to capture the model for validation logic, thanks.

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.