0

カスタム検証に使用される次のクラスがあります。

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
public sealed class RequiredIfAnyTrueAttribute : ValidationAttribute, IClientValidatable
{
    private const string DefaultErrorMessage = "{0} is required";

    public List<string> OtherProperties { get; private set; }

    public RequiredIfAnyTrueAttribute(string otherProperties)
        : base(DefaultErrorMessage)
    {
        if (string.IsNullOrEmpty(otherProperties))
            throw new ArgumentNullException("otherProperty");

        OtherProperties = new List<string>(otherProperties.Split(new char[] { '|', ',' }));
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, name);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null)
        {
            foreach (string s in OtherProperties)
            {
                var otherProperty = validationContext.ObjectType.GetProperty(s);
                var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance, null);

                if (otherPropertyValue.Equals(true))
                    return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
            }
        }

        return ValidationResult.Success;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var clientValidationRule = new ModelClientValidationRule()
        {
            ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
            ValidationType = "requiredifanytrue"
        };

        clientValidationRule.ValidationParameters.Add("otherproperties", string.Join("|",OtherProperties));

        return new[] { clientValidationRule };
    }
}

私のViewModelは次のとおりです。

public class SampleViewModel
{
    public bool PropABC { get; set; }
    public bool PropXYZ { get; set; }

    [RequiredIfAnyTrue("PropABC|PropXYZ")]
    public int? TestField { get; set; }
}

強く型付けされたビューがレンダリングされると、すべて正常に動作するように見えます。PropABC または PropXYZ が選択されている場合は、TestField の値を入力する必要があります。クライアント側とサーバー側の両方の検証が機能します。

ただし、次の一連のイベントがあるとします。

  1. PropABCをチェック
  2. フォームを送信
  3. TestField のクライアント側検証が必要です
  4. PropABCのチェックを外す
  5. クライアントの検証が再起動せず、フォームが送信されるまで検証メッセージが残る

#5 を解決するために、私は通常、jquery onready を介してクリック イベントをチェックボックスにアタッチし、検証を再起動します。

MVC3 + 目立たない + jquery を指定して、クライアント側の検証を手動で強制する推奨/推奨方法はありますか?

4

3 に答える 3

1

独自の属性を記述する必要がありますか? そうでない場合は、「車輪の再発明」を回避できると思います

FoolProofはうまく機能します。NuGet パッケージとして入手できます。

NuGet: install-package foolproof

オンザフライの必須フィールドなどのさまざまな組み合わせに対応する多くの優れた属性が含まれています。

于 2011-08-25T18:38:55.603 に答える
1

Shawn さん、イベントにアタッチするのが、再起動の検証を取得するための最良の方法です。

「validate」(またはそれらの行に沿ったもの) というクラスを作成し、それを検証する各要素に追加してから、jQuery を使用して各要素のクリックおよびぼかしイベント (および場合によっては変更イベント) にアタッチすることをお勧めします。そのクラスを作成し、要素を次のように検証します。

$("form").validate().element(this);
于 2011-08-28T13:57:43.287 に答える
0

FoolProof はまだベータ版であり、ネストされたビューモデルや配列では機能しません

于 2013-11-06T13:45:44.687 に答える