2

ASP.NET MVC 4 アプリケーションを使用しており、ビュー モデルのいくつかのプロパティを目立たないように検証したいと考えています。簡略化されたバージョンは次のとおりです。

ビューモデル:

[AtLeastOne(new[] {"FirstName", "LastName"})]
public class PersonViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

検証属性:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class AtLeastOneAttribute : ValidationAttribute, IClientValidatable
{
    private readonly string[] _propertyNames;

    public AtLeastOneAttribute(string[] propertyNames)
    {
        if (propertyNames == null) throw new ArgumentNullException("propertyNames");
        if (propertyNames.Length < 2) throw new ArgumentOutOfRangeException("propertyNames");
        _propertyNames = propertyNames;
    }

    public override bool IsValid(object value)
    {
        return true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var modelClientValidationRule = new ModelClientValidationRule
        {
            ErrorMessage = "AAAAA!!!",
            ValidationType = "atleastone",
        };
        modelClientValidationRule.ValidationParameters.Add(new KeyValuePair<string, object>("propertynames", _propertyNames));
        return new[]
        {
            modelClientValidationRule
        };
    }
}

私は持っていますが:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

Web.config および

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    <script type="text/javascript">
        jQuery.validator.unobtrusive.adapters.add("atleastone", ['FirstName', 'LastName'], function (options) {
            alert('options!');
        });
    </script>

私のビューに設定すると、この検証では何もレンダリングされません。たとえば、FirstName または LastName に [Required] を追加すると、data-* 検証属性が追加されます。

この複数プロパティのカスタム クライアント側検証を実現するにはどうすればよいですか?

ソリューション全体を表示/ダウンロードしたいですか?

4

1 に答える 1

2

クライアント側でのカスタム バリデータの追加は、2 ステップのプロセスです。

  1. 最初に、 で行ったように (そのような検証が存在することをフレームワークに知らせregisterますが、検証関数自体は追加しません) する必要があります。関数(3番目のパラメーター)はバリデーターではないことを覚えておく必要があります。これはルール構成のみを目的としています(場合によっては省略できます)。validatorunobtrusivejQuery.validator.unobtrusive.adapters.add

  2. それ自体を追加するvalidator

    jQuery.validator.addMethod("atleastone", function (value, element, param) { alert("validating 'atleastone'"); });

于 2013-05-28T10:17:39.813 に答える