Int या डेटा 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अपने मामले में , डेटा प्रकार के लिए त्रुटि संदेश भी बदलना होगा । कुछ डिफ़ॉल्ट एक का उपयोग किया जाता है - "फ़ील्ड होमटेम्प्रेडिक्शन एक संख्या होनी चाहिए।" इस त्रुटि संदेश को बदलने का तरीका खोजने की आवश्यकता है। यह सत्यापन संदेश दूरस्थ सत्यापन के लिए भी भविष्यवाणी लेता प्रतीत होता है।

मैंने [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", [रेंज (टाइपोफ़ (दशमलव)), "0", "9999.99", ErrorMessage = "मान {{0} के लिए {1} और {2}” के बीच होना चाहिए) तो एक अपवाद फेंक देते हैं। हालाँकि, अगर मैं [रेंज (टाइपोफ़ (दशमलव)), "0.1", "9999.99", ErrorMessage = "मान {0} के लिए {1} और {2}" के बीच होना चाहिए]], त्रुटि संदेश सही ढंग से काम करेगा। 0 बनाम 0.1, कोई मतलब नहीं है। बग शायद?
मई

1
यह "पूर्णांक" सत्यापन गैर-पूर्णांक मानों को मान्य मानता है (उदाहरण 0.3)
केविनपो

77

इन नियमित अभिव्यक्तियों में से एक आज़माएँ:

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


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

आशा है कि यह मदद करता है: डी


13
क्या कोई सरल तरीका नहीं है? मैं कुछ इस तरह की उम्मीद करूँगा: [न्यूमेरिक (ErrorMessage = "यह फ़ील्ड एक नंबर होना चाहिए")]
Banford

3
दुर्भाग्यवश नहीं। आप हमेशा अपनी मान्यता विशेषता लिख ​​सकते हैं।
गोरान Gorुरी

2
यह बेहतर समाधान है, क्योंकि यह तार को कवर करता है। int.MaxValueकेवल तब तक कवर किया जाता है जब2.147.483.647
क्रिश्चियन गोल्हार्ट

19

डेटा एनोटेशन में रेगेक्स का उपयोग करें

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

2
यह प्रश्न के संदर्भ में ठीक काम करता है, बशर्ते कि संपत्ति अंतरंग नहीं है, लेकिन स्ट्रिंग है।
पॉल

1
नियमित अभिव्यक्ति के आसपास कोष्ठक क्यों? यह सिर्फ हो सकता है [0-9]+?
पोलकदुरन

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;
    }
}

और आपको सत्यापनकर्ता प्लगइन में विशेषता को पंजीकृत करना होगा:

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 कोर 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; }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.