5

実装せずにクライアント側の検証を使用してカスタム検証属性を作成するにはどうすればよいIClientValidatableですか?

クライアント側はどのようSystem.ComponentModel.DataAnnotations.RequiredAttributeに検証しますか?

System.Web.MVCこれを行う理由は、別のプロジェクトのクラスのオブジェクトをビューのモデルとして使用しており、そのプロジェクトへの参照を追加したくないためです。

詳細情報を追加する編集:

  • IClientValidatable目立たない検証で後で使用されるカスタム属性を HTML に追加するために使用されることを私は知っています。

  • クライアントで検証を行うには、javascript コードを追加する必要があることはわかっています。

私が知らないのは、カスタム検証属性からの情報を使用して、目立たない検証が機能するために必要な属性を HTML に追加する方法です。

これは私のカスタム検証属性です:

public class RequiredGuidAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        Guid? guidValue = value as Guid?;

        if (guidValue == null)
            return false;

        return guidValue != Guid.Empty;
    }
}

これは、属性が適用された私のプロパティです。

    [RequiredGuid(ErrorMessageResourceType = typeof(ClientOrderResources), ErrorMessageResourceName = "RequiredShippingMethod")]
    public Guid ShippingMethodId
    {
        get { return GetProperty(ShippingMethodIdProperty); }
        set { SetProperty(ShippingMethodIdProperty, value); }
    }

最後に、 を使用して、ビュー内のそのプロパティの非表示の入力をレンダリングしていますHtml.HiddenFor

では、属性からエラー メッセージを取得して HTML に適用するにはどうすればよいでしょうか。リフレクションを使用して自分で行う必要がありますか、それともより良い方法がありますか?

そして、Html.HiddenForその情報を使用して必要な属性を HTML に追加するように指示するにはどうすればよいでしょうか?

4

3 に答える 3

7

同様の問題がありました。カスタム属性で IClientValidatable を使用するアカウントの作成に使用するモデルがあります。ただし、System.Web.Mvc を参照することができなかった Web サイトの外部にあるバッチ アカウント作成プロセスを作成しました。スキップしました。これは、私たちが取り組んでいたもので、ウェブサイトの外で検証できなかったものです:

public class AgeValidatorAttribute : ValidationAttribute, IClientValidatable
{
    public int AgeMin { get; set; }
    public int AgeMax { get; set; }

    public override bool IsValid(object value)
    {
        //run validation
    }
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = ErrorMessageString,
            ValidationType = "agevalidator"
        };

        rule.ValidationParameters["agemin"] = AgeMin;
        rule.ValidationParameters["agemax"] = AgeMax;

        yield return rule;
    }

System.Web.Mvc を削除するには、GetClientValidationRules と IClientValidatable 参照も削除する必要がありました。これを行い、クライアント側の検証を行うには、新しいクラスを作成する必要がありました。

public class AgeValidatorClientValidator : DataAnnotationsModelValidator<AgeValidatorAttribute>
{
    private readonly string _errorMessage;
    private readonly string _validationType;

    public AgeValidatorClientValidator(ModelMetadata metadata, ControllerContext context, AgeValidatorAttribute attribute)
        : base(metadata, context, attribute)
    {
        this._errorMessage = attribute.FormatErrorMessage(metadata.DisplayName);
        this._validationType = "agevalidator";
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = this._errorMessage,
            ValidationType = this._validationType
        };

        rule.ValidationParameters["agemin"] = base.Attribute.AgeMin;
        rule.ValidationParameters["agemax"] = base.Attribute.AgeMax;

        yield return rule;
    }
}

ご覧のとおり、基本的に以前と同じことを行います。IClientValidatable ではなく、DataAnatotationsModelValidator を使用して行われているだけです。DataAnnotationsModelValidator を実際に属性にアタッチするには、もう 1 つの手順が必要です。これは、Global.asax.cs の Application_Start メソッドで行われます。

DataAnnotationsModelValidatorProvider.RegisterAdapter( typeof(AgeValidatorAttribute), typeof(AgeValidatorClientValidator));

これで、通常の属性を使用するのと同じように使用できます。

[AgeValidator(AgeMax = 110, AgeMin = 18, ErrorMessage = "The member must be between 18 and 110 years old")]
public string DateOfBirth { get; set; }

この質問が 1 年前のものであることは承知していますが、昨日 1 日と今日の半分をこの問題の解決に費やしました。OPがまだ答えを見つけていない場合、これが同じ問題に遭遇した人に役立つことを願っています。

jQuery.validate を使用したカスタム検証ルールの標準実装から変更する必要がないため、この記事には JavaScript を含めていません。

于 2014-05-23T18:28:01.960 に答える
0

IClientValidatable を実装しない限り、クライアントでカスタム検証を行うことはできません。そのためには、クライアント スクリプトも追加する必要があります。

http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvccustomvalidation_topic3.aspx

于 2013-03-12T04:38:02.200 に答える
0

それは可能です、私はそれを行う方法についてこの記事を見つけました: http://xhalent.wordpress.com/2011/05/12/custom-unobstrusive-jquery-validation-in-asp-net-mvc-3-using- dataannotationsmodelvalidatorprovider/

基本的に、クライアントで DataAnnotationsModelValidator を作成し、それを Application_Start() に登録する必要があります。

また、クライアント側の検証用に Javascript を記述する必要があることも忘れないでください。

于 2014-03-18T13:14:50.907 に答える