Int หรือ Number DataType สำหรับแอตทริบิวต์การตรวจสอบความถูกต้อง DataAnnotation


111

ในโครงการ MVC3 ของฉันฉันจัดเก็บการทำนายคะแนนสำหรับเกมฟุตบอล / ฟุตบอล / ฮ็อกกี้ / ... ดังนั้นคุณสมบัติอย่างหนึ่งของคลาสการทำนายของฉันจึงมีลักษณะดังนี้:

[Range(0, 15, ErrorMessage = "Can only be between 0 .. 15")]
[StringLength(2, ErrorMessage = "Max 2 digits")]
[Remote("PredictionOK", "Predict", ErrorMessage = "Prediction can only be a number in range 0 .. 15")]
public int? HomeTeamPrediction { get; set; }

ตอนนี้ฉันต้องการเปลี่ยนข้อความแสดงข้อผิดพลาดสำหรับชนิดข้อมูลด้วยintในกรณีของฉัน มีค่าเริ่มต้นบางรายการที่ใช้ - "ฟิลด์ HomeTeamPrediction ต้องเป็นตัวเลข" ต้องหาวิธีเปลี่ยนข้อความแสดงข้อผิดพลาดนี้อย่างไร ข้อความตรวจสอบความถูกต้องนี้ดูเหมือนจะใช้การคาดการณ์สำหรับการตรวจสอบระยะไกลด้วย

ฉันได้ลองใช้[DataType]แอตทริบิวต์ แต่ดูเหมือนจะไม่ใช่ตัวเลขธรรมดาในการsystem.componentmodel.dataannotations.datatypeแจงนับ

คำตอบ:


221

สำหรับการตรวจสอบหมายเลขใด ๆ คุณต้องใช้การตรวจสอบช่วงที่แตกต่างกันตามความต้องการของคุณ:

สำหรับจำนวนเต็ม

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]

สำหรับลอย

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]

สำหรับสองเท่า

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]

4
สิ่งนี้ไม่ได้ผลสำหรับฉันในบริบทของฉัน หากผู้ใช้ป้อน "asdf", [Range (typeof (decimal), "0", "9999.99", ErrorMessage = "Value สำหรับ {0} ต้องอยู่ระหว่าง {1} ถึง {2}")] จะแสดงข้อยกเว้น อย่างไรก็ตามถ้าฉันทำ [Range (typeof (decimal), "0.1", "9999.99", ErrorMessage = "ค่าสำหรับ {0} ต้องอยู่ระหว่าง {1} ถึง {2}")] ข้อความแสดงข้อผิดพลาดจะทำงานได้อย่างถูกต้อง 0 vs 0.1 ไม่สมเหตุสมผล อาจจะมีข้อผิดพลาด?
ผล

1
การตรวจสอบความถูกต้อง "จำนวนเต็ม" นี้ถือว่าค่าที่ไม่ใช่จำนวนเต็มถูกต้อง (เช่น 0.3)
kevinpo

77

ลองใช้หนึ่งในนิพจน์ทั่วไปเหล่านี้:

// for numbers that need to start with a zero
[RegularExpression("([0-9]+)")] 


// for numbers that begin from 1
[RegularExpression("([1-9][0-9]*)")] 

หวังว่าจะช่วยได้: D


13
ไม่มีวิธีที่ง่ายกว่านี้หรือ? ฉันหวังว่าจะได้สิ่งที่ต้องการ: [Numeric (ErrorMessage = "ช่องนี้ต้องเป็นตัวเลข")]
Banford

3
น่าเสียดายที่ไม่มี คุณสามารถเขียนแอตทริบิวต์การตรวจสอบของคุณเองได้ตลอดเวลา
Goran Žuri

2
นี่เป็นทางออกที่ดีกว่าเนื่องจากครอบคลุมสตริง int.MaxValueครอบคลุมถึงวันที่2.147.483.647
Christian Gollhardt

19

ใช้ regex ในคำอธิบายประกอบข้อมูล

[RegularExpression("([0-9]+)", ErrorMessage = "Please enter valid Number")]
public int MaxJsonLength { get; set; }

2
ดูเหมือนว่าจะทำงานได้ดีในบริบทของคำถามโดยที่คุณสมบัตินั้นไม่ใช่ int แต่เป็นสตริง
Paul

1
ทำไมต้องมีวงเล็บรอบนิพจน์ทั่วไป มันอาจจะเป็นเพียง[0-9]+?
polkduran

5
public class IsNumericAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            decimal val;
            var isNumeric = decimal.TryParse(value.ToString(), out val);

            if (!isNumeric)
            {                   
                return new ValidationResult("Must be numeric");                    
            }
        }

        return ValidationResult.Success;
    }
}

5

ลองใช้แอตทริบิวต์นี้:

public class NumericAttribute : ValidationAttribute, IClientValidatable {

    public override bool IsValid(object value) {
        return value.ToString().All(c => (c >= '0' && c <= '9') || c == '-' || c == ' ');
    }


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

และคุณต้องลงทะเบียนแอตทริบิวต์ในปลั๊กอิน validator:

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

0

เกือบหนึ่งทศวรรษผ่านไป แต่ปัญหายังคงใช้ได้กับ Asp.Net Core 2.2 เช่นกัน

ฉันจัดการมันโดยการเพิ่มdata-val-numberลงในช่องป้อนข้อมูลใช้การแปลข้อความ:

<input asp-for="Age" data-val-number="@_localize["Please enter a valid number."]"/>

0

ASP.NET Core 3.1

นี่คือการใช้งานคุณสมบัติของฉันมันทำงานบนฝั่งเซิร์ฟเวอร์เช่นเดียวกับการตรวจสอบความถูกต้อง jquery โดยไม่สร้างความรำคาญด้วยข้อความแสดงข้อผิดพลาดที่กำหนดเองเช่นเดียวกับแอตทริบิวต์อื่น ๆ :

แอตทริบิวต์:

  [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public class MustBeIntegerAttribute : ValidationAttribute, IClientModelValidator
    {
        public void AddValidation(ClientModelValidationContext context)
        {
            MergeAttribute(context.Attributes, "data-val", "true");
            var errorMsg = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
            MergeAttribute(context.Attributes, "data-val-mustbeinteger", errorMsg);
        }

        public override bool IsValid(object value)
        {
            return int.TryParse(value?.ToString() ?? "", out int newVal);
        }

        private bool MergeAttribute(
              IDictionary<string, string> attributes,
              string key,
              string value)
        {
            if (attributes.ContainsKey(key))
            {
                return false;
            }
            attributes.Add(key, value);
            return true;
        }
    }

ตรรกะฝั่งไคลเอ็นต์:

$.validator.addMethod("mustbeinteger",
    function (value, element, parameters) {
        return !isNaN(parseInt(value)) && isFinite(value);
    });

$.validator.unobtrusive.adapters.add("mustbeinteger", [], function (options) {
    options.rules.mustbeinteger = {};
    options.messages["mustbeinteger"] = options.message;
});

และสุดท้ายการใช้งาน:

 [MustBeInteger(ErrorMessage = "You must provide a valid number")]
 public int SomeNumber { get; set; }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.