いいえ、重大な問題は発生していないため、簡単なメッセージの代わりに例外を表示することはお勧めできません...代わりにModelState
、これらのエラーを入力してフォームに表示する必要があります。
Html.ValidationMessage("EntityPropertyName");
xVal はこれらすべてをサポートしています。フォームがポストバックされる前に、クライアント側で検証するだけでなく。
いくつかのコード
DataAnnotations
エンティティ クラス (またはそのメタデータ コンパニオン クラス) に属性を設定する場合、ほとんどの場合、Validate() メソッドも実装します。最良の方法は、それらを自動生成する T4 を使用することです。そのため、同じコードを何度も繰り返す必要はありません...
public IEnumerable<ErrorInfo> Validate()
{
IList<ErrorInfo> errors = DataAnnotationsValidationRunner.GetErrors(this).ToList<ErrorInfo>();
return errors.AsEnumerable();
}
あなたがしなければならないことは、これを呼び出すことだけです:
IEnumerable<ErrorInfo> errors = entityObjectInstance.Validate();
if (errors.Any())
{
new RulesException(errors).AddModelStateErrors(filterContext.Controller.ViewData.ModelState, entityPropertyName);
}
これをさらに自動化するには、これをアクション フィルターに実装します。これにより、コントローラー アクションに渡されるエンティティ オブジェクトの検証が自動的に行われます。コントローラーのアクションは、その後かどうかを確認するだけで済みますModelState.IsValid()
。
ここで必要なもう 1 つのクラスは次のとおりです (どこかの Web から取得されます)。
public static class DataAnnotationsValidationRunner
{
public static IEnumerable<ErrorInfo> GetErrors(object instance)
{
var metadataAttribute = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
var metaClass = metadataAttribute != null ? metadataAttribute.MetadataClassType : instance.GetType();
var metaClassProperties = TypeDescriptor.GetProperties(metaClass).Cast<PropertyDescriptor>();
var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();
return from metaProp in metaClassProperties
join modelProp in modelClassProperties on metaProp.Name equals modelProp.Name
from attribute in metaProp.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(modelProp.GetValue(instance))
select new ErrorInfo(metaProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
}
}
MVC2
Asp.net MVC 2 Beta 2 での検証は、xVal と似ています。そのため、プロジェクトにあまり深く関わっておらず、開発中のコードを基盤として使用することを検討できる場合は、おそらくそれが最適な方法です。