0

私が構築している Web アプリケーションの一部は、ユーザー管理です。したがって、ユーザーエンティティが必要です。ユーザーが関与するいくつかの使用例があります。たとえば、次のとおりです。

  • ユーザーのリストを表示する
  • 1 人のユーザーを表示する
  • ユーザーの連絡先情報を編集する
  • ユーザーのログイン情報(ユーザー名とパスワード)の編集
  • 新しいユーザーを作成する

これらのほとんどは同じプロパティにアクセスする必要があるため、すべてのケースで同じエンティティを使用すると便利です。次に、たとえば DisplayName 属性を使用すると、すべての場所で同じ表示名が使用されます。

[Display(Name = "Username")]
public string Username { get; set; }

ユーザーを編集するときは、検証属性も使用したいと思います。

[Display(Name = "Username")]
[Required(ErrorMessage = "Username must be provided.")]
public string Username { get; set; }

この問題は、すべてではなく一部のプロパティが編集されているビューがある場合に発生します。「ユーザーの連絡先情報の編集」ユース ケースでは、編集できるもの (PhoneNumber など) と編集できないもの (Username など) があります。しかし、同じエンティティを使用すると、検証属性を持つすべてのプロパティが検証されます。

StackOverflow で検証の問題に対するいくつかの解決策を見つけましたが、エンティティとビューモデルを作成するときに「ベスト プラクティス」があるかどうか疑問に思っています。

たとえば、表示名と検証がアプリケーション全体で一貫していることを確認するために、できるだけ再利用することを好みます。しかし、それは多くの場合、上記のような問題や複雑な継承階層につながります。

私が持っている必要があります:

  • いくつかの類似した (しかし同一ではない) 実体?
  • いくつかの類似した (しかし同一ではない) ビューモデル?
  • 1 つのエンティティ + 検証の問題などの問題の回避策?
  • ...

助言がありますか?どうやってこれを自分で行うのですか?

編集中のものだけでなく、より多くの情報を表示することが多いことに注意してください。たとえば、連絡先情報を編集する場合、いくつかのプロパティ (PhoneNumber や EmailAddress など) の入力がありますが、他のプロパティはユーザーへの情報として表示されます (Username など)。

(問題があれば ASP.NET MVC 3 を使用しています)

4

3 に答える 3

1

検証が唯一の問題である場合は、fluentvalidation (http://fluentvalidation.codeplex.com) を使用することをお勧めします。そうすれば、シナリオごと (アクションごと) に検証ルールを設定できます。

シナリオごとに個別のビューモデルを使用し、fluentmvc で RuleSets 機能を利用して、DRY に違反しないようにします。

于 2012-10-09T14:26:01.023 に答える
1

ビューアプローチごとにビューモデルを使用することを検討します。これは余分な作業のように思えますが、コントローラーとビューがより簡潔で理解しやすくなると思います。それぞれのケースであなたの意図が何であるかは非常に明確であり、それでも強力なタイピングが得られます.

また、一括割り当ての脆弱性を潜在的に伴う別の問題も解決します(バインドの包含/除外など)。

最後にこの手法を使用すると、一部の人が魔法と考えるかもしれない余分なコーディングビットは必要ありません。少なくとも、このビューがモデルで何をしているのか、この他のビューと比較して、この他のビューと比較してコードを注意深く読む必要があります。同じモデルをわずかに異なる方法で使用します。

于 2012-10-09T14:41:09.627 に答える
0

モデルに変数検証ロジックを追加するには、IValidatableObject を実装できます。

public class VariableValidationEntity : IValidatableObject
{
    public string UserName { get; set; }
    public bool ValidateMe { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (ValidateMe)
        {
            if (string.IsNullOrWhiteSpace(UserName))
            {
                yield return new ValidationResult("Username Required", new[] { "UserName" });
            }
        }
    }
}

次に、モデルを使用している環境に応じて検証ロジックを指定できます。

または、ユース ケースごとにビュー モデルを作成し、ベース モデルから検証済みのモデルを派生させることもできます。

public class NonValidatedEntity
{
    public string UserName { get; set; }
}

public class ValidatedEntity : NonValidatedEntity, IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.IsNullOrWhiteSpace(UserName))
        {
            yield return new ValidationResult("Username Required", new[] { "UserName" });
        }
    }
}

私の意見では、後者のオプションの方がクリーンです。

于 2012-10-09T14:07:30.033 に答える