Sco*_*ott 20 c# forms validation asp.net-mvc asp.net-mvc-3
为了验证的目的,我如何将MVC 3表单上的多个文本框视为一个文本框?
这是一个简单的电话号码字段,其中一个区域代码文本框,一个用于前缀,一个用于最后四个数字.
实际上有两个验证要求:
1)他们都是必需的.2)它们都必须包含整数.
现在,对于单个字段执行此操作很简单,但是如何使用MVC创建ASP.NET CustomValidator的等效项,以便我可以将所有三个字段作为一个整体进行验证?
Sco*_*ott 21
我实际上最终实现了一个自定义ValidationAttribute
来解决这个问题,使用相同类型的逻辑CompareAttribute
,允许您使用反射来评估其他属性的值.这允许我在属性级而不是模型级实现它,并允许通过不引人注目的javascript进行客户端验证:
public class MultiFieldRequiredAttribute : ValidationAttribute, IClientValidatable
{
private readonly string[] _fields;
public MultiFieldRequiredAttribute(string[] fields)
{
_fields = fields;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
foreach (string field in _fields)
{
PropertyInfo property = validationContext.ObjectType.GetProperty(field);
if (property == null)
return new ValidationResult(string.Format("Property '{0}' is undefined.", field));
var fieldValue = property.GetValue(validationContext.ObjectInstance, null);
if (fieldValue == null || String.IsNullOrEmpty(fieldValue.ToString()))
return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "multifield"
};
}
}
Run Code Online (Sandbox Code Playgroud)
Tho*_*mas 18
您可以通过放置IValidatableObject
模型类并实现该Validate
方法来处理此问题.
它可能看起来像这样:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (String.IsNullOrEmpty(_PhonePart1) || String.IsNullOrEmpty(_PhonePart2)
|| String.IsNullOrEmpty(_PhonePart3))
{
yield return new ValidationResult("You must enter all " +
"three parts of the number.");
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19163 次 |
最近记录: |