从自定义验证代码(不知道如何从内置代码完成),您可以ValidationResult
通过从基类继承并从自定义验证属性返回来创建自定义类来做到这一点。
public class CustomValidationResult: ValidationResult
{
// additional properties
}
然后,您可以从控制器强制转换并检查验证结果是否是您的自定义类型并采取相应措施。
更新:
上面的想法不起作用,因为ValidationResult
该类在 DataAnnotations 程序集中,它们被转换为ModelValidationResult
,这就是我们在 MVC 中可以访问的全部内容。
似乎将数据注释验证中的额外信息传递给 MVC 看起来并不容易!
我正在浏览源代码,发现ValidatableObjectAdapter
将. 我看不出扩展这个类有多大好处,但我们可以通过实现和复制代码轻松地创建自定义。IEnumerable<ValidationResult>
IEnumerable<ModelValidationResult>
ValidatableObjectAdapter
ModelValidator
Validate
我们必须创建一个自定义ModelValidationResult
和自定义ValidationResult
(这是ValidationResult
我们将从验证中返回的自定义),并且在该ConvertResults
方法中我们可以放置我们的转换代码来处理附加信息。
public class CustomValidatableObjectAdapter : ModelValidator
{
public CustomValidatableObjectAdapter(ModelMetadata metadata, ControllerContext context)
: base(metadata, context)
{
}
public override IEnumerable<ModelValidationResult> Validate(object container)
{
object model = Metadata.Model;
if (model == null)
{
return Enumerable.Empty<ModelValidationResult>();
}
IValidatableObject validatable = model as IValidatableObject;
if (validatable == null)
{
throw new Exception("model is of not type validatable");
}
ValidationContext validationContext = new ValidationContext(validatable, null, null);
return ConvertResults(validatable.Validate(validationContext));
}
private IEnumerable<ModelValidationResult> ConvertResults(IEnumerable<ValidationResult> results)
{
foreach (ValidationResult result in results)
{
// iterate the ValidationResult enumeration and cast each into CustomValidationResult
// and conver them into enumeration of CustomModelValidationResult.
}
}
}
最后,我们必须告诉DataAnnotationsModelValidatorProvider
我们CustomValidatableObjectAdapter
在Application_Start
Global.asax.cs 事件中的使用。
DataAnnotationsModelValidatorProvider.RegisterDefaultValidatableObjectAdapterFactory((metadata, context) => new CustomValidatableObjectAdapter(metadata, context));
所以你必须创建一个自定义ValidationResult
,自定义ModelValidationResult
和一个自定义ValidatableObjectAdapter
。
我没有对此进行测试,但我希望这会奏效。我可能会建议一个比这更好、更容易的解决方案。