1

実際には、別の検証方法を使用しても問題ありません。ASP.NET MVC 1.0 で検証を行うために事前に作成されたオプションはあまりないようです。話題になっているのは主に xVal です。ただし、文字通りそれに関するドキュメントはありません。実際、創業者のブログには 2 つしか投稿されていないようです。

とにかく、クライアントの検証も提供できるのは私が見た唯一のものです。私の問題は、LLBLGen を使用してモデルを生成していて、コードを変更したくないため、属性ベースのものを使用できないことです。

私が xVal について読んだことはすべて、IRulesProvider を実装する可能性について語っていますが、それを実行して使用する方法に関する実際の情報はありません。それを実装するコードをいくつか見つけましたが、実際にはできない属性を使用しています。

したがって、モデルクラスを手作業でコーディングしていない場合、または DataAnnotations などを使用する予定がない場合、xVal の使用方法について誰かがガイダンスを提供できます (xVal の代替手段を受け入れていますが、何も見ていないので、 ASP.NET MVC 1.0 に固執し、クライアント側の検証サポートが必要ですか)?

編集:コードを大量に生成し、それらが異なるアセンブリにあるため、部分クラスのアプローチはうまくいかないと思います。

4

2 に答える 2

4

部分クラスで MetadataType 属性を使用することにより、LLBLGen またはその他の ORM 生成クラスで xVal を使用できます。たとえば、UserEntity という名前の LLBL 生成エンティティがある場合、部分クラスを作成し、次のように MetadataType 属性でマークアップします。

[MetadataType(typeof(UserEntityMetaData))]
public partial class UserEntity
{
}

次のように、適切な属性を使用してプロパティをマークアップできる Meta クラスを作成します。

public class UserEntityMetaData
{
    [Required()]
    [StringLength(50)]
    [DataType(DataType.EmailAddress)]
    public object EmailAddress { get; set; }
    [Required()]
    [StringLength(32)]
    [DataType(DataType.Password)]
    public object Password { get; set; }
    [Required()]
    [StringLength(25)]
    public object FirstName { get; set; }
    [Required()]
    [StringLength(25)]
    public object LastName { get; set; }
}

これにより、LLBL で生成されたコードを変更する必要がなくなり、カスタムの部分クラスだけを変更できます。唯一の問題は、生成されたエンティティ クラスと同じ名前空間に部分クラスとメタ クラスの両方が必要になることです。これを行う必要はありませんが、xVal 検証を呼び出すと作業が簡単になります。

于 2010-01-17T15:51:50.963 に答える
1

jcerheaが言ったことに加えて、GetErrorsメソッドの「バディ」クラスを処理するようにDataAnnotationsValidationRunnerクラスを設定する方法も変更する必要があります。

    namespace Entities
    {
        public static class DataAnnotationsValidationRunner
        {
            public static IEnumerable<ErrorInfo> GetErrors(object instance)
            {
                var metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
                var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType();
                var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
                var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

                return from buddyProp in buddyClassProperties
                       join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name
                       from attribute in buddyProp.Attributes.OfType<ValidationAttribute>()
                       where !attribute.IsValid(modelProp.GetValue(instance))
                       select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
            }
        }
    }
于 2010-01-17T22:43:10.813 に答える