1

検証時に複数のフィールドを比較したいようなビューモデルがあります。ビューモデルを取得して必要な検証を実行するカスタム属性があります。ビューモデル クラスをカスタム属性 [ValidateThisForm] で装飾しています

[AttributeUsage(AttributeTargets.Class)]
public class ValidateThisForm : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        ViewModel _viewModel = value as ViewModel;

        if (_viewModel.TestOne == false && _viewModel.TestTwo == false)
        {
            ErrorMessage = "Form Incomplete: Please correct";
            return false;
        }
        else
        {
            return true;
        }
    }
}

問題は、いくつかの「クラスレベル」の検証を実行したいということです。その結果、私の見解では、これらのエラーはフォームの 1 か所にしか表示できません。

<td class = "field-validation-error">@Html.ValidationMessageFor(viewmodel => viewmodel)</td>

複数の「クラス レベル」エラーをフォームの異なる場所に表示する方法はありますか?

4

1 に答える 1

0

クラスが現在次のようになっていると仮定します。

[ValidateThisForm]
public class MyViewModel
{
    public bool TestOne { get; set; }
    public bool TestTwo { get; set; }
}

実行したい複雑なモデル レベルの検証があり、単一のプロパティに単純に注釈を付けることができない場合は、次のIValidatableObjectように検証パイプラインにフックできます。

public class MyViewModel : IValidatableObject
{
    public bool TestOne { get; set; }
    public bool TestTwo { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    { 
      if (TestOne == false && TestTwo == false) 
      {
          yield return new ValidationResult("Form Incomplete: Please correct")
      }
    }
}

yield return必要な数の検証メッセージを続行できます。そして、それらすべてをクライアントに表示できます@Html.ValidationSummary

メッセージを特定のコントロールと一緒に表示したい場合、ValidationResultコンストラクターは影響を受けるプロパティのオーバーロードを取得するため、次のようにメソッドmemberNamesを変更できます。Validate

if (TestOne == false && TestTwo == false) 
{
    yield return new ValidationResult("Form Incomplete Message", new[] {"TestOne"})
}

ValidationMessageFor次に、次のような HTML ヘルパーを使用して、その特定のプロパティの検証メッセージを提供できます。

@Html.ValidationMessageFor(Function(model) model.TestOne )

さらに読むために、Scott Guthrie は、MVC3 の新機能を紹介IValidatableObjectするブログ投稿の一部として使用について書いており、その後すぐに、クラス レベルの検証の詳細を記載したフォローアップ投稿を行いました。

于 2015-01-26T16:10:24.473 に答える