จะระบุขั้นต่ำ แต่ไม่มีทศนิยมสูงสุดโดยใช้แอตทริบิวต์หมายเหตุประกอบข้อมูลช่วงได้อย่างไร


150

ฉันต้องการระบุว่าฟิลด์ทศนิยมของราคาจะต้อง> = 0 แต่ฉันไม่ต้องการกำหนดค่าสูงสุด

นี่คือสิ่งที่ฉันมีจนถึงตอนนี้ ... ฉันไม่แน่ใจว่าวิธีการที่ถูกต้องคืออะไร

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }

ถ้าเป็นไปได้ในฐานข้อมูลคุณจะต้องระบุจำนวนสูงสุดที่อนุญาตตามประเภทฐานข้อมูลที่เลือกหรือไม่ มิฉะนั้นคุณจะได้รับข้อยกเว้นที่น่ารังเกียจหากเกินจำนวนนี้
Coops

คำตอบ:


226

เกี่ยวกับบางสิ่งเช่นนี้:

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]

ควรทำสิ่งที่คุณกำลังมองหาและคุณสามารถหลีกเลี่ยงการใช้สตริง


1
ฉันใช้มันสำหรับ Int32 (Int32.MaxValue) และมันก็โอเคขอบคุณ!
Bronek

15
มันจะแสดงข้อความการตรวจสอบความโง่แม้ว่า :(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Piotr Kula

16
@ppumkin Använd ErrorMessage คือ [ช่วง (0.0, Double.MaxValue, ErrorMessage = "ข้อผิดพลาดของคุณที่นี่")]
flafffl

ขอบคุณยาโคบ คำตอบที่ดี!
pimbrouwers

1
@ppumkin สืบทอดจากคลาส DataAnnotationsModelValidator เพื่อกำหนดข้อความแสดงข้อผิดพลาด
Alexander

91

หากคุณกังวลเกี่ยวกับสตริงที่ดูดีคุณสามารถทำได้:

    [Range(0, Double.PositiveInfinity)]

นี่จะมีข้อความแสดงข้อผิดพลาดเริ่มต้นเป็น:

ช่อง SuchAndSuch ต้องอยู่ระหว่าง 0 ถึง Infinity


11
นี่คือคำตอบที่ดีที่สุดที่นี่ IMHO ไม่มีส่วนขยายไม่มีสตริง / หมายเลขสุ่มดูเหมือนไม่มีรหัสที่กำหนดเองและข้อความแสดงข้อผิดพลาดที่สมเหตุสมผล
Vitani

42

ดูเหมือนว่าไม่มีทางเลือกนอกจากต้องใส่ค่าสูงสุดด้วยตนเอง ฉันหวังว่าจะมีการโอเวอร์โหลดบางประเภทที่คุณไม่จำเป็นต้องระบุ

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }

14
รหัสนี้ดูน่ากลัว ฉันขอแนะนำให้ใช้dataannotationsextensions.orgผ่านทาง nuget และเป็น @Nicolai Schlenzig ตอบ ใช้[Min(0)]- ข้อความนี้ยังมีข้อความยืนยันที่ดีกว่า ฉันขอแนะนำให้อัปเดตคำตอบของคุณ
Piotr Kula

ฉันอัปเดตมันเพื่อให้เป็นเช่นเดียวกับคำตอบที่ดีที่สุดที่นี่เนื่องจาก OP ไม่เปลี่ยนความคิดของเขาฮ่า ๆ
Worthy7

คำตอบข้างต้น (@Jordan และ @Jacob) เหมาะสมกว่ามาก โดยเฉพาะอย่างยิ่งเนื่องจากเรากำลังพูดถึงราคา ฉันเข้าใจว่าการทำธุรกรรมหลายครั้งต้องทำด้วยค่าทศนิยม แต่ไม่มีราคาใด ๆ ที่ 1.234 ดอลลาร์หรืออย่างน้อยที่สุดคุณไม่ต้องการแสดงให้ผู้ใช้เห็น
Anastasios Selmanis

@AnastasiosSelmanis ฉันเห็นด้วยกับคุณคาดหวังส่วนเมื่อคุณพูดว่า "แต่ไม่มีราคาใด ๆ 1.234 ดอลลาร์" คุณกำลังสมมติว่า USD และแม้กระทั่งเมื่อคุณใช้สิ่งนี้สำหรับการแลกเปลี่ยนเงินตราต่างประเทศ (แม้ว่าจะไม่ได้กล่าวถึงที่นี่โดย OP) USD จะเข้าสู่ทศนิยมมากขึ้น =)
RoLYroLLs

35

คุณสามารถใช้ได้:

[Min(0)]

สิ่งนี้จะกำหนดค่าต่ำสุดที่จำเป็นเป็น 0 (ศูนย์) และไม่มีค่าสูงสุด

คุณต้องการDataAnnotationsExtensionsเพื่อใช้สิ่งนี้


8
ไม่ฉันไม่คิดว่ามันถูกต้อง มันไม่ได้เป็นส่วนหนึ่งของกรอบ MVC3 มาตรฐานมันก็มาจากข้อมูลส่วนขยายคำอธิบายประกอบdataannotationsextensions.org โปรดระบุลิงก์ MSDN
Bernie White

1
NO - ไม่แน่นอนส่วนหนึ่งของ MVC 3 :( แต่ห้องสมุดที่เป็นส่วนขยายที่ดีที่จะมีวิธีการใด ๆ :)
Piotr กุลา

1
ไม่ใช่ส่วนหนึ่งของ MVC3 แต่ไม่สำคัญ หากคุณต้องการการตรวจสอบความถูกต้องทางฝั่งไคลเอ็นต์คุณเพียงแค่ต้องใช้แพ็คเกจ DataAnnotationsExtensions.MVC3 แพ็กเกจทั้งสองนี้มีอยู่ใน nuget ฉันคิดว่ามันเป็นวิธีที่ดีที่สุดเนื่องจากคุณไม่มีข้อความแสดงข้อผิดพลาดโง่ ๆ หรือไม่จำเป็นต้องกำหนดข้อความแสดงข้อผิดพลาดใหม่ทุกครั้งที่คุณต้องการตรวจสอบความถูกต้องของจำนวนเต็มบวกหรือทศนิยม (ซึ่งเป็นเรื่องธรรมดา)
gentiane

21

หากคุณกำลังทำงานกับราคาฉันแน่ใจว่าคุณสามารถสรุปได้อย่างปลอดภัยว่าไม่มีอะไรจะมีราคามากกว่า 1 ล้านล้านดอลลาร์

ฉันต้องการใช้:

[Range(0.0, 1000000000000)]

หรือหากคุณต้องการจริงๆเพียงแค่วางค่าDecimal.MaxValue(โดยไม่มีเครื่องหมายจุลภาค):79,228,162,514,264,337,593,543,950,335

หากคุณไม่ได้มาจากซิมบับเว


7
ทำไมไม่เพียง[Range(0.0,Decimal.MaxValue)]?
Coops

4
จะไม่รวบรวม Decimal.MaxValue ไม่ใช่ค่าคงที่
John Farrell

ค่าคงที่นั้นเป็นสิ่งที่สร้างความรำคาญโดยอ้างถึงไฟล์ทรัพยากรสำหรับข้อความแสดงข้อผิดพลาดไม่ใช่เรื่องง่าย
Coops

3
ตอนนี้คุณกำลังสมมุติว่าสกุลเงินคือดอลลาร์ไม่ใช่เยนหรืออย่างอื่น
Fred

1
@jfar Decimal.MaxValue เป็นค่าคงที่ เป็นเพียงช่วงที่ไม่มีการโอเวอร์โหลดเพื่อรองรับทศนิยม
ΕГИІИО

11

คุณสามารถใช้การตรวจสอบที่กำหนดเอง:

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public int IntValue { get; set; }

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public decimal DecValue { get; set; }

ประเภทวิธีการตรวจสอบ:

public class ValidationMethods
{
    public static ValidationResult ValidateGreaterOrEqualToZero(decimal value, ValidationContext context)
    {
        bool isValid = true;

        if (value < decimal.Zero)
        {
            isValid = false;
        }

        if (isValid)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(
                string.Format("The field {0} must be greater than or equal to 0.", context.MemberName),
                new List<string>() { context.MemberName });
        }
    }
}

2

ฉันจะลองทำสิ่งนี้:

[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than or equal to zero.")]

แม้ว่าปัญหาของการทำเช่นนี้คือคอมไพเลอร์ต้องการนิพจน์คงที่ซึ่งไม่สามารถ((double)0).ToString()ทำได้ คอมไพเลอร์จะใช้เวลา

[Range(0d, (double)decimal.MaxValue, ErrorMessage = "Amount must be greater than zero.")]

ใครก็ตามที่ลงคะแนนโปรดอธิบายว่าทำไมคุณคิดว่าโซลูชันของฉันไม่ดีหรือไม่เป็นประโยชน์ เพราะเพียงแค่ downvoting โดยไม่มีคำอธิบายใด ๆ จะไม่ช่วยเหลือโดยสิ้นเชิง
David T. Macknet

ข้อความแสดงข้อผิดพลาดของคุณควรพูดว่า "มากกว่าหรือเท่ากับ"
ΕГИІИО

จับดี. ที่เพิ่ม
David T. Macknet

1

ใช้ช่วงกับ

[Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]

[Range(typeof(Decimal),"0.0", "1000000000000000000"]

หวังว่ามันจะช่วย



0

ฉันจะใส่decimal.MaxValue.ToString()ตั้งแต่นี้เป็นเพดานที่มีประสิทธิภาพสำหรับประเภท decmial มันเทียบเท่ากับไม่มีขอบเขตบน


4
ปัญหาคือไม่คงที่ คุณจะได้รับข้อผิดพลาดนี้: อาร์กิวเมนต์ของแอททริบิวต์จะต้องเป็นนิพจน์คงที่, นิพจน์ประเภทหรือการสร้างอาเรย์ของประเภทพารามิเตอร์แอททริบิวต์
user169867

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