web-dev-qa-db-ja.com

ブール値の必須属性をmvcに追加する方法は?

次のようなモデルクラスが1つあります。

public class Student
{
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [Display(Name = "Enrollment Date")]
    public DateTime EnrollmentDate { get; set; }

    [Required]
    [Display(Name = "Is Active")]
    public bool IsActive { get; set; }

    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

ここでは、Boolean属性を持つIsActiveプロパティRequiredを作成しましたが、問題は、このプロパティに必要な検証をビューが実行していないことです。このプロパティをCheckBoxにバインドし、このCheckBoxがチェックされているかどうかを確認し、チェックされていない場合は検証を実行します。

これに対する解決策はありますか?

33
Sonu K
[Display(Name = "Is Active")]
[Range(typeof(bool), "true", "true", ErrorMessage="The field Is Active must be checked.")]
public bool IsActive { get; set; }
66
Sonu K

上記の解決策に感謝し、正しい方向に導いてくれましたが、私にとってはうまくいきませんでした。上記のソリューションを動作させるには、jqueryバリデーターを拡張するページに以下のスクリプトを追加する必要があります。誰かが同様の問題に遭遇した場合、これを共有することを考えました。

<script>
        // extend jquery range validator to work for required checkboxes
        var defaultRangeValidator = $.validator.methods.range;
        $.validator.methods.range = function(value, element, param) {
            if(element.type === 'checkbox') {
                // if it's a checkbox return true if it is checked
                return element.checked;
            } else {
                // otherwise run the default validation function
                return defaultRangeValidator.call(this, value, element, param);
            }
        }
</script>
25
Kris

Sonu K投稿に少し追加してみましょう

HTML検証(<input type="checkbox" required/>)を使用すると、モデルから空の必須フィールドセットを送信できなくなるため、JavaScriptが混乱する可能性があります。

最後に、移行中にIs Activeをデータベースに追加したくない場合(コードを最初に)[NotMapped]を追加します

完全なコード

[NotMapped]
[Display(Name = "Is Active")]
[Range(typeof(bool), "true", "true", ErrorMessage="The field Is Active must be checked.")]
public bool IsActive { get; set; }

mVCでデフォルトでtrueに設定されているのは、ブラウザーでチェックがオフになっているにもかかわらず、検証が期待どおりに機能しない可能性があるためです。

<script>
            // extend jquery range validator to work for required checkboxes
            var defaultRangeValidator = $.validator.methods.range;
            $.validator.methods.range = function(value, element, param) {
                if(element.type === 'checkbox') {
                    // if it's a checkbox return true if it is checked
                    return element.checked;
                } else {
                    // otherwise run the default validation function
                    return defaultRangeValidator.call(this, value, element, param);
                }
            }
        </script>

コーディングをお楽しみください

3
Odin