开发者

MVC3 / EF CustomValidator two fields in model

开发者 https://www.devze.com 2023-04-01 17:53 出处:网络
Using MVC3 and EF4.1 how do I validate on client and server more than one field in my view model? I have a start date text box (that can be modified) and I have the original start date in a hidden fi

Using MVC3 and EF4.1 how do I validate on client and server more than one field in my view model?

I have a start date text box (that can be modified) and I have the original start date in a hidden field. When the user submits the form I want to check that the开发者_JAVA技巧 modied start date is no more than one month either side of the original start date.

I can't figure out how this can be done with DataAnnotation and CustomValidation (or maybe I'm going down the wrong road)? This is an example of whay I've been working with:

[MetadataType(typeof(Metadata.MyUserMetaData))]
public partial class MyUser
{
    public System.DateTime DateOfBirth { get; set; }    
}

Partial Class

public class MyUserMetaData
{
    [CustomValidation(typeof(AmendedStartDate), "amendedstartdate", ErrorMessage = "Invalid date."]
    public DateTime StartDate { get; set; };

    public DateTime OriginalStartDate { get; set; };
}

Custom Validator

public class AmendedStartDate : ValidationAttribute, IClientValidatable
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // How do I get multiple field values from object value?
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(Modelmetadata metadate, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
        ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
            ValidationType = "amendedstartdate"
        };

        yield return rule;
    }
}

I know I've still to add jQuery to the view for this validator.


Instead of using data annotations implement IValidatableObject on your model class - it is simpler and much more clear in scenarios with cross validation.

If you still want to use ValidationAttribute you have two parameters in the IsValid method:

  • value represents validated value of the property where the attribute is assigned
  • context is context in which the property is validated. It also contains ObjectInstance and ObjectType properties to access the whole model and its type so you can cast the instance and access other properties.


The question asked in MVC custom validation: compare two dates has an example of a validator which compares to a second value in the model. That should get you started.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号