C# 根据其他字段的值进行验证(MVC)

C# 根据其他字段的值进行验证(MVC),c#,regex,validation,C#,Regex,Validation,我有3个输入框供某人输入电话号码。一个表示区号(3位),一个表示前缀(3位),一个表示后缀(4位)。我想在保存之前验证3个字段的总和是否等于10。如何使用数据注释来实现这一点 型号: public string PhoneNumber { get { return _phoneNumber; } set { _phoneNumber = value;

我有3个输入框供某人输入电话号码。一个表示区号(3位),一个表示前缀(3位),一个表示后缀(4位)。我想在保存之前验证3个字段的总和是否等于10。如何使用数据注释来实现这一点

型号:

 public string PhoneNumber
    {
        get
        {
            return _phoneNumber;
        }
        set
        {
            _phoneNumber = value;
        }
    }      
    private string _phoneNumber;
    public string Area
    {
        get
        {
            try
            {
                return _phoneNumber.Split(new char[] { '(', ')', '-' }, StringSplitOptions.RemoveEmptyEntries)[0].Trim();
            }
            catch
            {
                return "";
            }
        }

    }

    public string Prefix
    {
        get
        {
            try
            {
                return _phoneNumber.Split(new char[] { '(', ')', '-' }, StringSplitOptions.RemoveEmptyEntries)[1].Trim();
            }
            catch
            {
                return "";
            }
        }

    }

    public string Suffix
    {
        get
        {
            try
            {
                return _phoneNumber.Split(new char[] { '(', ')', '-' }, StringSplitOptions.RemoveEmptyEntries)[2].Trim();
            }
            catch
            {
                return "";
            }
        }

    }

你可以这样做:

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string area = (string)validationContext.ObjectType.GetProperty("Area").GetValue(validationContext.ObjectInstance, null);
        string prefix = (string)validationContext.ObjectType.GetProperty("Prefix").GetValue(validationContext.ObjectInstance, null);
        string suffix = (string)validationContext.ObjectType.GetProperty("Suffix").GetValue(validationContext.ObjectInstance, null);

        if ((area.Length + prefix.Length + suffix.Length) == 10)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult("I will not use DA for this, but there we go...");
        }
    }
或者先连接值,然后只使用属性值

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string number = (string)value;
        if (number.Length == 10)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult("I will not use DA for this, but there we go...");
        }
    }

你可以这样做:

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string area = (string)validationContext.ObjectType.GetProperty("Area").GetValue(validationContext.ObjectInstance, null);
        string prefix = (string)validationContext.ObjectType.GetProperty("Prefix").GetValue(validationContext.ObjectInstance, null);
        string suffix = (string)validationContext.ObjectType.GetProperty("Suffix").GetValue(validationContext.ObjectInstance, null);

        if ((area.Length + prefix.Length + suffix.Length) == 10)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult("I will not use DA for this, but there we go...");
        }
    }
或者先连接值,然后只使用属性值

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string number = (string)value;
        if (number.Length == 10)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult("I will not use DA for this, but there we go...");
        }
    }

这里有两种可能的方法

IValidatableObject 正如用户在评论中提到的,您可以在模型中实现来进行验证。 在您的情况下,您的代码如下所示:

public class MyModel : IValidatableObject
{
    // Your properties go here

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // You may want to check your properties for null before doing this
        var sumOfFields = PhoneNumber.Length + Area.Length + Prefix.Length;

        if(sumOfFields != 10)
            return new ValidationResult("Incorrect phone number!");
    }
}

请注意,如果编译器不支持C#6.0,则必须将以$开头的字符串更改为string.Format,并且必须用nameof()中的属性名替换其他硬编码名称。

这里有两种可能的方法

IValidatableObject 正如用户在评论中提到的,您可以在模型中实现来进行验证。 在您的情况下,您的代码如下所示:

public class MyModel : IValidatableObject
{
    // Your properties go here

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // You may want to check your properties for null before doing this
        var sumOfFields = PhoneNumber.Length + Area.Length + Prefix.Length;

        if(sumOfFields != 10)
            return new ValidationResult("Incorrect phone number!");
    }
}

请注意,如果您的编译器不支持C#6.0,则必须将以$开头的字符串更改为string.Format,并且必须用nameof()中的属性名称替换其他硬编码名称。

一种方法是像您一样实现,先生……您是真正的mvp。一个简单的问题,用“nameof()中的属性名替换它们的硬编码名”是什么意思?nameof表达式在编译时计算为传递给它的成员的字符串表示形式。例如,nameof(PhoneNumber)将计算为字符串“PhoneNumber”。您可以简单地使用“PhoneNumber”而不是nameof(PhoneNumber)。使用nameof的主要优点是,如果您将来需要更改该属性名称,它将更易于维护。我明白了…感谢您的解释。但是,我收到一个错误,告诉我在声明名称时“非静态字段、方法或属性'RxCard.DataObjects.Pharmacy.Area'”需要对象引用。对不起,我是.net的新手。如果不看你的代码,我不能肯定地回答你。但看起来您正在尝试调用静态方法中的.Area。如果在nameof(Area)和其他nameof中发生这种情况,请尝试将它们更改为nameof(Pharmacy.Area)。否则,我会寻找尝试使用区域作为实例属性的静态方法。先生,你是真正的mvp。一个简单的问题,用“nameof()中的属性名替换它们的硬编码名”是什么意思?nameof表达式在编译时计算为传递给它的成员的字符串表示形式。例如,nameof(PhoneNumber)将计算为字符串“PhoneNumber”。您可以简单地使用“PhoneNumber”而不是nameof(PhoneNumber)。使用nameof的主要优点是,如果您将来需要更改该属性名称,它将更易于维护。我明白了…感谢您的解释。但是,我收到一个错误,告诉我在声明名称时“非静态字段、方法或属性'RxCard.DataObjects.Pharmacy.Area'”需要对象引用。对不起,我是.net的新手。如果不看你的代码,我不能肯定地回答你。但看起来您正在尝试调用静态方法中的.Area。如果在nameof(Area)和其他nameof中发生这种情况,请尝试将它们更改为nameof(Pharmacy.Area)。否则,我将寻找尝试使用Area作为实例属性的静态方法。