從自定義驗證代碼(不知道如何從內置的代碼完成),您可以通過從基礎繼承創建自定義ValidationResult
類並從您的自定義驗證屬性返回來實現。
public class CustomValidationResult: ValidationResult
{
// additional properties
}
然後從控制器,你可以施放和檢查驗證結果是你的自定義類型,並採取相應的行動。
更新:
以上想法不工作,因爲ValidationResult
類是在DataAnnotations組裝和它們轉換成ModelValidationResult
而這一切,我們可以在MVC訪問。
它似乎從數據註釋驗證傳遞額外的信息到MVC看起來不是很容易!
我正在瀏覽源代碼,發現它是ValidatableObjectAdapter
,它將IEnumerable<ValidationResult>
轉換爲IEnumerable<ModelValidationResult>
。我沒有看到擴展此類的好處,但我們可以通過執行ModelValidator
並複製Validate
代碼輕鬆地創建自定義ValidatableObjectAdapter
。
我們必須創建一個自定義ModelValidationResult
和自定義ValidationResult
(這是該自定義ValidationResult
我們將b從驗證返回)和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.
}
}
}
最後,我們要告訴在Application_Start
事件Global.asax.cs中的DataAnnotationsModelValidatorProvider
使用這個我們。
DataAnnotationsModelValidatorProvider.RegisterDefaultValidatableObjectAdapterFactory((metadata, context) => new CustomValidatableObjectAdapter(metadata, context));
所以,你必須創建一個自定義ValidationResult
,定製ModelValidationResult
和一個自定義ValidatableObjectAdapter
。
我還沒有測試過這個,但我希望這會起作用。我可能會建議一個比這更好更簡單的解決方案。
我已經在MVC3中統計了很多不同的地方,其中ModelValidationError被轉換爲ModelState,所以我不認爲有一個簡單的方法來做到這一點。 – IanBru