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