ตัวตรวจสอบค่าต่ำสุด / สูงสุดใน asp.net mvc


106

การตรวจสอบความถูกต้องโดยใช้แอตทริบิวต์ใน asp.net mvc นั้นดีมาก ฉันใช้ตัว[Range(min, max)]ตรวจสอบความถูกต้องในการตรวจสอบค่าเช่น:

[Range(1, 10)]
public int SomeNumber { get; set; }

อย่างไรก็ตาม - ตอนนี้ฉันต้องตรวจสอบเงื่อนไขขั้นต่ำและสูงสุดแยกกัน ฉันคาดว่าจะพบคุณลักษณะดังนี้:

[MinValue(1, "Value must be at least 1")]
[MaxValue(10, "Value can't be more than 10")]
public int SomeNumber { get; set; }

มีคุณลักษณะที่กำหนดไว้ล่วงหน้าสำหรับการเขียนสิ่งนี้หรือไม่? หรือฉันจะบรรลุสิ่งนี้ได้อย่างไร?


FluentValidation เป็นอีกทางเลือกหนึ่งในการแก้ไขช่วงวันที่ นี่คือคำตอบของฉันคำถามที่อาจจะเป็นประโยชน์อีก
Zinov

คำตอบ:


48

นี่คือวิธีที่ฉันจะเขียนตัวตรวจสอบความถูกต้องสำหรับ MaxValue

public class MaxValueAttribute : ValidationAttribute
    {
        private readonly int _maxValue;

        public MaxValueAttribute(int maxValue)
        {
            _maxValue = maxValue;
        }

        public override bool IsValid(object value)
        {
            return (int) value <= _maxValue;
        }
    }

แอตทริบิวต์ MinValue ควรจะเหมือนกัน


ตกลงคาดหวังว่าจะมีอยู่จริง แต่ก็ยุติธรรมพอที่จะเขียน ขอบคุณ!
stiank81

1
เพียงแค่ FYI สิ่งนี้จะไม่สามารถตรวจสอบความถูกต้องของแบบฟอร์มในส่วนท้าย Javascript ได้ คุณจะต้องเขียนโค้ดเพิ่มเติม + js สำหรับสิ่งนั้น
Basarat

3
@basarat จริงคุณจะไม่ต้อง JS พิเศษห้องสมุดการตรวจสอบ jQuery แล้วมีฟังก์ชั่นสำหรับ min max / คุณเพียงแค่ต้องใช้IClientValidationอินเตอร์เฟซแอตทริบิวต์ดังกล่าวข้างต้นและกลับค่าที่ถูกต้องจากGetClientValidationRulesวิธีการ
WickyNilliams

@WickyNilliams คุณจะเพิ่มคำตอบพร้อมตัวอย่างความคิดเห็นของคุณหรือ CharlesOuellet คุณจะแก้ไขคำตอบนี้ด้วยตัวอย่างความคิดเห็นของ Wicky? ฉันชอบที่จะยกระดับตัวอย่างการทำงานที่มีการตรวจสอบความถูกต้องของฝั่งไคลเอ็นต์
Johnie Karr

@JohnieKarr ฉันไม่ได้ทำงานกับ. NET อีกต่อไปดังนั้นฉันจึงไม่สามารถให้คำตอบได้มากนัก ที่กล่าวว่าคำตอบด้านล่างนี้ดูเหมือนจะแสดงสิ่งที่ฉันอธิบายไว้อย่างแน่นอน
WickyNilliams

195

ฉันไม่คิดว่ามีแอตทริบิวต์การตรวจสอบความถูกต้องขั้นต่ำ / สูงสุดอยู่ ฉันจะใช้สิ่งที่ชอบ

[Range(1, Int32.MaxValue)]

สำหรับค่าต่ำสุด 1 และ

[Range(Int32.MinValue, 10)]

สำหรับมูลค่าสูงสุด 10


4
อืม .. ไม่ค่อยสบายใจกับเรื่องนี้ ดูแฮ็คไปหน่อยสำหรับฉัน
stiank81

21
มันค่อนข้างแฮ็ค .. แต่บางครั้งการแฮ็กก็ทำให้ฉันสบายใจขึ้น :)
Guy

4
วิธีนี้ใช้ได้ดีตราบเท่าที่คุณลบล้างข้อความแสดงข้อผิดพลาดเริ่มต้นไม่เช่นนั้นคุณจะได้รับสิ่งที่น่ากลัวเช่น "คุณสมบัติ x ต้องอยู่ระหว่าง -2e ^ 31-1 ถึง 10"
Nine Tails

2
แฮ็คและอึดอัดขนาดนี้ได้ยังไง? ดูเหมือนจะเป็นแนวทางที่ดีสำหรับฉัน

1
RangeAttributeมีAllowMultiple = falseดังนั้นสิ่งนี้จึงไม่สามารถรวบรวมได้
Daniel Schilling

38

ตัวอย่างที่สมบูรณ์ของวิธีการนี้สามารถทำได้ เพื่อหลีกเลี่ยงการเขียนสคริปต์การตรวจสอบความถูกต้องฝั่งไคลเอ็นต์จึงได้ใช้ ValidationType = "range" ที่มีอยู่

public class MinValueAttribute : ValidationAttribute, IClientValidatable
{
    private readonly double _minValue;

    public MinValueAttribute(double minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;  
    }

    public MinValueAttribute(int minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;
    }

    public override bool IsValid(object value)
    {
        return Convert.ToDouble(value) >= _minValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = ErrorMessage;
        rule.ValidationParameters.Add("min", _minValue);
        rule.ValidationParameters.Add("max", Double.MaxValue);
        rule.ValidationType = "range";
        yield return rule;
    }

}

8
คำตอบที่ดี ฉันจะแก้ไขข้อความแสดงข้อผิดพลาดเล็กน้อย: "ป้อนค่าที่มากกว่าหรือเท่ากับ" เป็นข้อความแสดงข้อผิดพลาดที่ถูกต้องมากขึ้น (พูดตามหลักไวยากรณ์)
Tieson T.

0

jQuery Validation Plugin ใช้กฎขั้นต่ำและสูงสุดอยู่แล้วเราเพียงแค่ต้องสร้างอะแดปเตอร์สำหรับแอตทริบิวต์ที่กำหนดเองของเรา:

public class MaxAttribute : ValidationAttribute, IClientValidatable
{
    private readonly int maxValue;

    public MaxAttribute(int maxValue)
    {
        this.maxValue = maxValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();

        rule.ErrorMessage = ErrorMessageString, maxValue;

        rule.ValidationType = "max";
        rule.ValidationParameters.Add("max", maxValue);
        yield return rule;
    }

    public override bool IsValid(object value)
    {
        return (int)value <= maxValue;
    }
}

อะแดปเตอร์:

$.validator.unobtrusive.adapters.add(
   'max',
   ['max'],
   function (options) {
       options.rules['max'] = parseInt(options.params['max'], 10);
       options.messages['max'] = options.message;
   });

แอตทริบิวต์นาทีจะคล้ายกันมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.