質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

C#で独自のValidationAttributeクラスを作りたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 203

OhtaJunko

score 1

前提・実現したいこと

C#で独自のValidationAttributeクラスを作りたいと思っています。

発生している問題・エラーメッセージ

下のようなコードを書いてみたのですが『このコードが実行されない!』の部分が実行されません。
その結果、テストにも合格しません。
どうしたら、『このコードが実行されない!』の部分が実行され、テストに合格するようになるでしょうか?
というか、どうすれば、独自のValidationAttribute(下はMyValidationAttribute)が動作するようになるでしょうか?

    public class Test
    {
        [MyValidationAttribute]
        public string ABC { get; set; }
    }

    public sealed class MyValidationAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            Debug.WriteLine("このコードが実行されない!");
            return false;
        }
    }

    [TestClass()]
    public class MyValidationAttributeTests
    {

        [TestMethod()]
        public void IsValidTest()
        {
            var test = new Test();
            var context = new ValidationContext(test);
            var errors = new List<ValidationResult>();
            var isValid = Validator.TryValidateObject(test, context, errors);
            Assert.IsFalse(isValid);
            Assert.AreNotEqual(0, errors.Count);
        }
    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2020/07/11 16:10

    何を作っているか書いてください。 ASP.NET MVC? それとも WPF?
    開発環境(OS, .NET Framework, Visual Studio のバージョンなど)を書いてください。

    キャンセル

回答 1

checkベストアンサー

+2

IsValidTestメソッドの中に、以下のように書いて、IsValidTestメソッドを実行してみてくださいませ
C# ValidationAttribute v = new MyValidationAttribute(); v.IsValid("aaa");

「ValidationAttribute v」の部分は、「MyValidationAttribute v」でもいけます。

見当違いの回答をしてしまったため、上記は削除(^o^;)

TN8001さんのご指摘にもあるように、
Validator.TryValidateObject(test, context, errors, true)
と、第4引数にtrueを指定するといいようです

falseだと

if false, only required attributes are validated.

だそうです

当初の第3引数までだと、falseと同じ扱いと思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/11 16:47

    それでは属性を付けた意味がないですよね?
    Validator.TryValidateObject(test, context, errors, true)
    としたら呼ばれるようになりました(なんでかは知りません^^;

    キャンセル

  • 2020/07/11 19:31

    ありがとうございます。
    こちらで解決しました。
    確かに、trueにしないとダメでしょうね。。

    キャンセル

  • 2020/07/13 00:17

    おっと大変失礼しました(^o^;)
    属性があるとこのような書き方ができるんですね

    キャンセル

  • 2020/07/13 00:34

    お気になさらず^^
    ここだと目立たないので、よろしければ閲覧者のために回答を修正or追記していただけたらと思います。

    気になったので調べたのですが、
    [Validator.TryValidateObject メソッド (System.ComponentModel.DataAnnotations) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations.validator.tryvalidateobject)
    だと
    > 必要な属性のみを検証するには false。
    と何言っているか微妙ですが、英語だと
    > if false, only required attributes are validated.
    とはっきりしてますね。
    でも「validateAllAttributes」じゃないんですかね?w

    ソースも確認しましたがコメントが入っていました。
    [Validator.cs](https://referencesource.microsoft.com/#System.ComponentModel.DataAnnotations/DataAnnotations/Validator.cs,399)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る