1

開発者が才能を発揮する言語を選択するためのチェックボックスをリストするだけです.少なくとも1つの言語を選択する必要があるという検証を行うのが好きです.

サーバー側の検証は失敗せずに機能しますが、クライアント側で機能させることができませんでした。「GetClientValidationRules」メソッドでさえ呼び出されたことはありません。

IEnumerable はクライアント側の検証でサポートされていませんか?これを行う方法は何ですか?

ps: GetClientValidationRules が呼び出されたら問題ないと思うので、js 検証コードを入力する必要はありません。

表示: (簡潔にするために簡略化しています)

public class DeveloperViewModel
{        
    [DeveloperLanguageSelectOneValidation(ErrorMessage="Please check at least one lang")]
    public IEnumerable<SelectListItem> LanguagesModel { get; set; }

}

検証:

public class DeveloperLanguageSelectOneValidationAttribute : ValidationAttribute ,IClientValidatable
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        IEnumerable<SelectListItem> items = (IEnumerable<SelectListItem>)value;
        foreach (var item in items)
            if (item.Selected)
                return ValidationResult.Success;
        return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }

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

        return new[] { rule };
    }
}

SelectListItem ビュー:

@model SelectListItem
<li>
    @Html.HiddenFor(a => a.Value)
    @Html.CheckBoxFor(a => a.Selected)
    @Html.DisplayFor(a => a.Text)
</li>

開発者ビュー:

 <ul>
        @Html.EditorFor(a => a.LanguagesModel)</ul>
    @Html.ValidationMessageFor(a => a.LanguagesModel)
4

1 に答える 1

0

jqueryを使ってみてはどうですか?

$.validator.addMethod('require-one', function(value) {
    return $('.require-one:checked').size() > 0;
}, 'Please check at least one box.');

var checkboxes = $('.require-one');
var checkbox_names = $.map(checkboxes, function(e, i) {
    return $(e).attr("name")
}).join(" ");

$("#itemForm").validate({
    groups: {
        checks: checkbox_names
    },
    errorPlacement: function(error, element) {
        if (element.attr("type") == "checkbox") error.insertAfter(checkboxes.last());
        else error.insertAfter(element);
    }
});

あなたのフォーム:

<form name="itemForm" id="itemForm" method="post">

<label for="checkbox1">checkbox1</label>
<input checked="checked" data-val="true" data-val-required="The checkbox1 field is required." id="checkbox1" name="checkbox1" type="checkbox" value="true" class="require-one" />
<input name="checkbox1" type="hidden" value="false" /><br />

<label for="checkbox2">checkbox2</label>
<input checked="checked" data-val="true" data-val-required="The checkbox2 field is required." id="checkbox2" name="checkbox2" type="checkbox" value="true" class="require-one" />
<input name="checkbox2" type="hidden" value="false" /><br />

<label for="checkbox3">checkbox3</label>
<input checked="checked" data-val="true" data-val-required="The checkbox3 field is required." id="checkbox3" name="checkbox3" type="checkbox" value="true" class="require-one" />
<input name="checkbox3" type="hidden" value="false" /><br />

<input type="submit" />
</form>

から: https://stackoverflow.com/a/11512622/1026898

于 2012-12-02T07:07:03.123 に答える