2

DataAnnotationsを使用してクラスの手動検証を実行しようとしています。アプリケーションはコンソールアプリであるため、MVCは関与しません。.NET4.0を使用しています。

この記事からガイダンスを得ました。唯一の違いは、メタデータクラスを使用しようとしていることです。しかし、私が読んだ他のことは、これができることを示唆しています。

ただし、実行時に、オブジェクトは検証に合格します。私はMVC3でDataAnnotationsを使用していて、かなり良いと思っていましたが、困惑しています。

私は何が欠けていますか?System.ComponentModel.DataAnnotations以外に必要なアセンブリはありますか?

/// This is a partial-class addition to an Entity Framework class, so the properties are
/// defined in the EF .designer.cs file.  
[MetadataType(typeof(EntityMetadata.tblThingMetaData ))]
public partial class tblThing
{

}

メタデータクラス:

public partial class tblThingMetaData
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "Sequence number is required")]
    [RegularExpression("A")]
    public string seq_num { get; set; }
}

テスト:

    [TestMethod]
    public void VerifyValidationWorksOnEntities()
    {
        tblThing newThing = new tblThing()
        {
            seq_num = "B"
        };

        List<ValidationResult> results = new List<ValidationResult>();
        bool validationResult = Validator.TryValidateObject(
            newThing,
            new ValidationContext(newThing, null, null),
            results,
            true);

        Assert.AreNotEqual(0, results.Count);
        Assert.IsFalse(validationResult);
    }

newThing.seq_numnullであること、プロパティのみを検証することなど、他のバリエーションを試しました seq_num。常に検証に合格し、検証結果はありません。テストは常に失敗します。

あなたが私に与えることができるどんなアドバイスにも感謝します。

4

1 に答える 1

3

ここで答えが見つかりました。明らかに、検証する前に以下を追加しない限り、これはSilverlightまたはMVCの外部では機能しません。

TypeDescriptor.AddProviderTransparent(
   new AssociatedMetadataTypeTypeDescriptionProvider(
       typeof(tblThing),
       typeof(EntityMetadata.tblThingMetaData)
   ), typeof(tblThing));

typeof(tblThing)最後のパラメータは、ではなく、である必要があることに注意してくださいnewThing。メタデータに関連付けているタイプの単一のインスタンスを取得するオーバーロードがあり、それが検証する予定の同じインスタンスであっても、タイプではなくインスタンスを指定すると機能しません。

面倒ですが、少なくとも今は機能します。

于 2013-01-22T16:11:53.853 に答える