วิธีใดที่ดีที่สุดในการเพิ่มตัวตรวจสอบความถูกต้องมากกว่า 0 บนฝั่งไคลเอ็นต์โดยใช้ MVC และคำอธิบายประกอบข้อมูล


96

ฉันต้องการอนุญาตให้ส่งแบบฟอร์มได้ก็ต่อเมื่อค่าในฟิลด์หนึ่ง ๆ มากกว่า 0 ฉันคิดว่าแอตทริบิวต์ Mvc Range อาจอนุญาตให้ฉันป้อนเพียง 1 ค่าเพื่อแสดงว่ามีค่ามากกว่าการทดสอบเท่านั้น แต่ ไม่มีโชคเพราะยืนยันค่าต่ำสุดและสูงสุด

ความคิดใด ๆ ที่สามารถทำได้?

คำตอบ:


250

คุณไม่สามารถจัดเก็บตัวเลขที่ใหญ่กว่าที่ประเภทข้อมูลพื้นฐานของคุณสามารถเก็บไว้ได้ดังนั้นข้อเท็จจริงที่ว่าแอตทริบิวต์ Range ต้องการค่าสูงสุดจึงเป็นสิ่งที่ดีมาก โปรดจำไว้ว่าไม่มีอยู่ในโลกแห่งความจริงดังนั้นสิ่งต่อไปนี้ควรใช้งานได้:

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }

ข้อเสียของวิธีนี้คือว่าถ้ามันจะตรวจสอบ "ABCD" Please enter a value less than or equal to 2147483647มันจะแสดง:
Mike Cole

คุณไม่ควรป้อนตัวอักษรในช่องตัวเลข ปัญหาที่ฉันพบคือถ้าฉันป้อน 9999999999999999999 มันบอกว่าหมายเลขของฉันน้อยเกินไป
John Lord

17

ฉันพบคำตอบนี้เพื่อตรวจสอบความถูกต้องของค่าบวกสำหรับ float / double ปรากฎว่าประเภทเหล่านี้มีค่าคงที่ที่เป็นประโยชน์สำหรับ 'Epsilon'

หมายถึง System.Double ค่าที่น้อยที่สุดที่มากกว่าศูนย์

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }

เอปไซลอนเป็นฟังก์ชันแคลคูลัส มันเป็นฟังก์ชัน "ขีด จำกัด " ที่โดยพื้นฐานแล้วระบุว่า "จำนวนที่น้อยที่สุดที่สามารถแยกแยะได้จากศูนย์" ดังนั้นคุณจึงสามารถลงท้ายด้วย. 00000001 ฉันจะใส่จำนวนจริงลงในนาที
John Lord

10

คุณสามารถสร้างตัวตรวจสอบความถูกต้องของคุณเองได้ดังนี้:

    public class RequiredGreaterThanZero : ValidationAttribute
{
    /// <summary>
    /// Designed for dropdowns to ensure that a selection is valid and not the dummy "SELECT" entry
    /// </summary>
    /// <param name="value">The integer value of the selection</param>
    /// <returns>True if value is greater than zero</returns>
    public override bool IsValid(object value)
    {
        // return true if value is a non-null number > 0, otherwise return false
        int i;
        return value != null && int.TryParse(value.ToString(), out i) && i > 0;
    }
}

จากนั้นรวมไฟล์นั้นในโมเดลของคุณและใช้เป็นแอตทริบิวต์ดังนี้:

    [RequiredGreaterThanZero]
    [DisplayName("Driver")]
    public int DriverID { get; set; }

ฉันมักจะใช้สิ่งนี้ในการตรวจสอบแบบเลื่อนลง โปรดทราบว่าเนื่องจากเป็นการขยายการตรวจสอบแอตทริบิวต์คุณจึงสามารถปรับแต่งข้อความแสดงข้อผิดพลาดด้วยพารามิเตอร์


1
ฉันใช้คำตอบนี้สำหรับสถานการณ์อื่นที่ต้องใช้ตัวตรวจสอบความถูกต้องที่กำหนดเอง สำหรับการตรวจสอบความถูกต้องจำนวนเต็มมากกว่าศูนย์ควรใช้คำตอบของดาริน
Zach

ที่จริงฉันชอบวิธีการของเขาเช่นกัน แต่คนที่ฉันทำงานด้วยมีปัญหากับการ "กำหนดขีด จำกัด โดยพลการ" กับค่านิยม
John Lord

ฮ่าที่ดูแปลก ๆ ฉันสามารถดูเหตุผลของพวกเขาได้หากช่วงที่ถูกต้องน้อยกว่าขนาดจำนวนเต็มสูงสุด
Zach

มันเป็นปัญหาเกี่ยวกับทศนิยมมากกว่า ฉันค่อนข้างแน่ใจว่าไม่มีฟังก์ชัน min หรือ max ในตัว
John Lord

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