1

現在、ユーザーが部分的に作成できる顧客クラスがあり、詳細情報を完成させることができます。たとえば、次のようになります

新規顧客

    [Required(ErrorMessage = "Business name is required.")]
    [Display(Name = "Business Name:")]
    public string BusinessName { get; set; }

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

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

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

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

カスタマーチェックアウト

    [Required(ErrorMessage = "Business name is required.")]
    [Display(Name = "Business Name:")]
    public string BusinessName { get; set; }

    [Required(ErrorMessage = "Address is required.")]
    [Display(Name = "Address:")]
    public string Address { get; set; }

    [Required(ErrorMessage = "City is required.")]
    [Display(Name = "City:")]
    public string City { get; set; }

    [Required(ErrorMessage = "State is required.")]
    [Display(Name = "State:")]
    public string State { get; set; }

    [Required(ErrorMessage = "Zip is required.")]
    [Display(Name = "Zip:")]
    public string Zip { get; set; }

ユーザーがチェックアウトに行くとき、いくつかが不足している場合は、情報の入力が完了していることを確認する必要があります。私の思考プロセスは、新しい顧客を作成したときの情報が入力された顧客チェックアウトクラスを作成し、それらをチェックアウトに渡す前に有効かどうかを確認することでした。私の問題は、各フィールドをstring.isNullOrEmpty()と照合することですが、もっと良い方法が必要であることを知っています。このように25のフィールドをチェックする必要があります。モデルが有効かどうかを確認できることは知っていますが、すべての[必須]フィールドにデータがあることを確認するために、データアクセス層のチェックでクラスレベルでこれを行う必要があります。うまくいけば、私は何かを見落としているだけです

まるで私が何かをするための何らかの方法が必要なように

bool hasErrors = false 

foreach attribute in my class 
if it is marked as [required]
check to make sure not null or empty
if it is set hasErrors = true

ありがとう!

4

2 に答える 2

2

モデルのカスタム検証を作成する必要があります。

インターフェイスIValidatableObjectを実装し、メソッドを実装してオーバーライドし、Validateたとえばカスタム検証を作成します

public class Foo : IValidatableObject
{

      public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
      {
          //make your custom rules for validation on server side
        if ((fooAttribute== true) && (fooAtribute2 == String.Empty))
        {
            yield return new ValidationResult("Your custom Error");
        }
      }

} 

NOTE: これにより、アプリケーションのサーバー側で検証を実現しています

于 2012-05-24T15:31:39.137 に答える
1

パフォーマンスが考慮されない場合は、リフレクションを使用してオブジェクトを自動的に検証できます。

static class ObjectValidator
{
    public static bool IsValid(object toValidate)
    {
        Type type = toValidate.GetType();
        var properties = type.GetProperties();
        foreach(var propInfo in properties)
        {
            var required = propInfo.GetCustomAttributes(typeof(RequiredAttribute), false);
            if (required.Length > 0)
            {
                var value = propInfo.GetValue(toValidate, null);
                // Here you'll need to expand the tests if you want for types like string
                if (value == default(propInfo.PropertyType))
                    return false;
            }
        }
        return true;
    }
}
于 2012-05-24T16:36:25.197 に答える