1


1

データ注釈を使用して「選択的」検証を行うことは可能ですか?

現在、13個のオブジェクトを投稿するフォームがあります。 リファラーなど、一部のオブジェクトはオプションである場合もあれば、そうでない場合もあります。 問題は、DAVを使用し、オブジェクトがオプションであっても、 `[Required]`などの検証属性でオブジェクトを修飾すると、 `ModelState`が無効になるため投稿全体が失敗することです。

すべてのオブジェクトから `[Required]`装飾を削除できますが、それは適切ではありません。 では、DAVを使用しながら個々のオブジェクトを選択的に検証する方法はありますか?

このことを考慮:

        Office
        {?}


        Description

この_非常に簡略化された_フォームでは、私は Job`と Description`で作業しています(DBに関する限り、 Description`は実際には Note`型です)。 「ジョブ」情報を入力する必要がありますが、説明はオプションです。 フォームの問題は、 `Description.AuthorId`が常に現在許可されているユーザーのIDで設定されることです。

public class Note {
    [Required]
    public short AuthorId { get; set; }

    [Required, StringLength(XXX)]
    public string Text { get; set; }
}

public RedirectToRouteResult Jobs(
    [Bind(Prefix = "Job", Include = "OfficeId")] Job Job,
    [Bind(Prefix = "Description", Include = "AuthorId,Text")] Note Description) {
    if (ModelState.IsValid) {
        if (Description != null) {
            Description.Job = Job;
        };

        DataContext.Jobs.InsertOnSubmit(Job);
        DataContext.SubmitChanges();
    };
}

メソッドの最初の問題は、フォームが常に Description.AuthorId`を渡すため、 Description`のフォームが常に生成されるため、 Description`であっても Description`がnullであるかどうかの条件チェックが呼び出されないことです。テキストが入力されたことはありません。

2番目の問題は、「Description.Text」が設定されていない場合、「Note」の必須フィールドであるため、モデル全体の検証が失敗するため、DAVが原因です。 それによって、私は他に何もする機会さえ得られないでしょう。

だから、私の質問は、UIフォームでオプションになる可能性があるオブジェクトに検証(DAV?)を実装する適切な方法は何でしょうか?データベース設計のためにそれ自体に必須フィールドがありますか?

私が考えている1つの方法は、オブジェクトをメソッドに渡す代わりに、オブジェクトをメソッドでインスタンス化してから、それぞれに対して「TryUpdateModel」を実行し、モデルの状態を確認し、条件に基づいて続行することです これには多くのコードが必要になる可能性があるため、そのソリューションに進む前に、より自動化されたバージョンがあるかどうかを確認したいと思います。

助けていただければ幸いです。

1 Answer


0


私の提案は、このような場合にビューモデル(ビューデータ/検証およびモデルバインディングに使用され、後でdbモデルにマップされる単純なモデル)を作成することです。 すべての検証でビジネス/データベースモデルをプッシュしようとすることは常に可能とは限りません。 一部の場所でモデルが異なる方法で検証された場合、それらが両方とも緑であるという理由だけで、正方形の穴に丸い釘を押し付けている可能性が最も高いでしょう。 何らかの制限のために同じオブジェクトを絶対に使用する必要がある場合は、検証を無視するか、コントローラーのModelStateディクショナリから問題のあるエラーを削除することを選択できますが、これはお勧めできません。