4

このプロジェクトでは、名前空間のデフォルトのdataannotation属性を使用しませんSystem.ComponentModel.DataAnnotationsが、カスタム属性が作成されます。

したがって[required]、プロパティに属性を配置しますが、これはカスタムビルドの属性です。

サーバー側の検証では、カスタム検証プロバイダーを使用して検証をオーバーライドすることができましたが、クライアント側の検証でスタックしています。

ドキュメントを読んでいると、デフォルトの[required]属性を使用すると、これらの種類の属性がhtml要素にレンダリングされることがわかります。

data-val-lengthmax="10" data-val-length-min="3" data-val-required="The ClientName field is required."

これは、通常の属性を読み取り、requiredhtml属性をレンダリングするフレームワークによって行われると思います。

フレームワークにこれらの属性をレンダリングさせることはできますか?

4

2 に答える 2

4

フレームワークにこれらの属性をレンダリングさせることはできますか?

はい、2つの可能性があります:

  1. カスタム属性にIClientValidatable、クライアント検証ルールを実装するインターフェイスを実装してもらいます。
  2. DataAnnotationsModelValidator<TAttribute>TAttributeがカスタム検証属性になり、カスタムクライアント側検証ルールを実装するカスタムを登録します(これは、必須属性のクライアント側検証を実装するためにMicrosoftが使用するアプローチであり、そのため、派生するカスタムバリデーター属性を作成する場合それから、クライアント側の検証は得られません)。DataAnnotationsModelValidatorProvider.RegisterAdapter次に、 callを使用してカスタムモデルバリデーターをカスタム属性に登録する必要があります。
于 2012-10-19T06:32:34.460 に答える
2

カスタム属性でクライアント検証を有効にするためにIClientValidatable、属性にインターフェースを実装できます。

public class requiredAttribute : ValidationAttribute, IClientValidatable
{
    ...

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new[] { new ModelClientValidationRule { ErrorMessage = "<Your error message>", ValidationType = "required" } };
    }
}

別の方法として、属性の検証アダプターを実装できます。

public class requiredAttributeAdapter : DataAnnotationsModelValidator<requiredAttribute>
{
    public requiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute)
        : base(metadata, context, attribute)
    { }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new[] { new ModelClientValidationRule { ErrorMessage = "<Your error message>", ValidationType = "required" } };
    }
}

そして、Global.asaxのデータ注釈検証エンジンに登録します。

protected void Application_Start()
{
    ...
    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(requiredAttribute), typeof(requiredAttributeAdapter));
}

もちろん、上記のクラスで属性を参照していることを確認する必要があります。

于 2012-10-19T06:39:25.637 に答える