c# MVC/JQuery सत्यापन दशमलव विभाजक के रूप में अल्पविराम को स्वीकार नहीं करता है




asp.net-mvc asp.net-core (3)

मुझे लगता है कि समस्या jquery सत्यापनकर्ता है, जिसका उपयोग इस प्रकार अल्पविराम / बिंदु त्रुटि को हल करने के लिए किया जाता है

$.validator.methods.number = function (value, element) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
}

बस इसके साथ खेलने की कोशिश करो

अपडेट 07.01.2018

भले ही यह सुझाव दिया गया था, कि यह MVC समस्या की बजाय एक jQuery समस्या है, मुझे लगता है कि यह MVC समस्या है। मैंने asp.net core 2.0 MVC में संपूर्ण ऐप बनाया है और त्रुटि बनी रहती है। मेरे लिए इसे MVC से [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] है, यह तथ्य है कि मैं [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] में लाइन [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] को जोड़कर दिनांक सत्यापन समस्या को हल कर सकता हूं। इसलिए, एमवीसी की मान्यता पर प्रभाव पड़ता है। इसलिए मुझे लगता है कि इसे ठीक करने के लिए MVC में कोई रास्ता है (यह post देखें)। कृपया asp.net कोर 2.0 के लिए उत्तर पोस्ट करें।

मूल पोस्ट

एक MVC5 पृष्ठ में मैं एक पाठ बॉक्स में एक Double संपत्ति प्रस्तुत करता हूं। जब पृष्ठ लोड किया जाता है, तो मान को "," दशमलव विभाजक के रूप में दिखाया जाता है, जो सही है, क्योंकि पृष्ठ जर्मन सिस्टम पर चलता है। यदि मैं फ़ॉर्म को सहेजना चाहता हूं, तो मुझे एक सत्यापन त्रुटि मिलती है। इसे कैसे हल किया जा सकता है? मुझे पता है कि विषय पर कुछ प्रश्न हैं, लेकिन जहाँ तक मैं देख सकता हूँ, उनमें से अधिकांश पुराने हैं ... मैं अभी भी संघर्ष कर रहा हूँ, कि कोई सेटिंग या कुछ भी निर्मित नहीं है, जो विभिन्न देशों के उपयोगकर्ताओं को अनुमति देता है MVC एप्लिकेशन के साथ काम करते हैं।

आदर्श:

[DisplayFormat(DataFormatString = "{0:n2}", ApplyFormatInEditMode = true)]
public Double Gewicht
{
    get { return gewicht; }
    set { gewicht = value; OnPropertyChanged(new PropertyChangedEventArgs("Gewicht")); }
}

CSHTML:

<div class="form-group">
    @Html.LabelFor(model => model.Gewicht, htmlAttributes: new { @class = "control-label col-md-3" })
    <div class="col-md-8">
        @Html.EditorFor(model => model.Gewicht, new { htmlAttributes = new { @class = "form-control col-md-1" } })
        @Html.ValidationMessageFor(model => model.Gewicht, "", new { @class = "text-danger" })
    </div>
</div>

web.config

<globalization uiCulture="de-DE" culture="de-DE" />

इसके लोड होने के बाद बॉक्स -> दशमलव विभाजक के रूप में अल्पविराम से भरा हुआ मान

सबमिट बटन पर क्लिक करने के बाद बॉक्स -> समान मान के लिए सत्यापन त्रुटि

अल्पविराम के बाद बॉक्स को बिंदु में बदल दिया जाता है -> कोई सत्यापन त्रुटि नहीं

अपडेट 05.01.2018

मैंने here दिखाए गए समाधान की कोशिश की here जो दुर्भाग्य से मेरे लिए काम नहीं करता है। हालाँकि, मैंने यह भी पता लगाया, कि मानों को न केवल स्वीकार किया जाता है, बल्कि उन संख्याओं में भी बदल दिया जाता है जहाँ समूह विभाजक और दशमलव विभाजक को मिलाया जाता है (चित्र देखें)। क्या होता है, कि 22 का मान 22.5 में बदल जाता है और डेटाबेस में संग्रहीत हो जाता है। परिणाम मधुमक्खी, कि डेटाबेस में 2,250.00 का मान संग्रहीत किया जाता है।

अपडेट 07.01.2018

यह भी दिलचस्प है, तथ्य यह है कि दिनांक फ़ील्ड जर्मन प्रारूप को पूरी तरह से ठीक मानती हैं।

संपत्ति

private DateTime? inbetriebnahmedatum;

[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? Inbetriebnahmedatum
{
    get { return inbetriebnahmedatum; }
    set { inbetriebnahmedatum = value; OnPropertyChanged(new PropertyChangedEventArgs("Inbetriebnahmedatum")); }
}

नीचे दिखाया गया मूल्य बिना किसी त्रुटि के स्वीकृत और संसाधित किया गया है।

अपडेट 07.01.2018 - 2

अगर मैं edit.cshtml से लाइन को बदलता हूं

<input asp-for="Gewicht" class="form-control" />

सेवा मेरे

<input name="Gewicht" id="Gewicht" type="number" class="form-control" value="@Model.Gewicht"/>

फॉर्म सत्यापन त्रुटियों के बिना "23,7" मूल्य के साथ प्रस्तुत किया जा सकता है। नियंत्रक में, बाध्य मॉडल गुण "237" का मान दिखाता है, जहां IFormCollection "23.7" का मान दिखाता है। यह मॉडल बाइंडर के साथ एक समस्या का सुझाव देगा।


भले ही यह सुझाव दिया गया था, कि यह MVC समस्या की बजाय एक jQuery समस्या है, मुझे लगता है कि यह MVC समस्या है।

नहीं, यह सही नहीं है। आप क्लाइंट साइड सत्यापन त्रुटि देख रहे हैं, क्योंकि डिफ़ॉल्ट रूप से, jquery.validate.js (माइक्रो सॉफ्ट के साथ जुड़ा हुआ एक स्वतंत्र 3 पार्टी प्लगइन, जो क्लाइंट साइड सत्यापन के लिए एमवीसी का उपयोग करता है) दशमलव विभाजक होने के आधार पर संख्याओं को मान्य करता है . (डॉट), ए , (अल्पविराम) नहीं।

MVC सर्वर साइड कोड है और ब्राउज़र में नहीं चलता है। क्लाइंट साइड सत्यापन करने के लिए, MVC के HtmlHelper तरीके जो नियंत्रण उत्पन्न करते हैं, data-val-* एक सेट को प्रस्तुत data-val-* HTML में विशेषताओं का उपयोग उस सत्यापन का वर्णन करने के लिए किया जाता है, जो कि jquery.validate.unobtrusive.js प्लगइन द्वारा पार्स किया जाता है। जब DOM लोड किया जाता है, और $.validator नियम जोड़ने के लिए उन का उपयोग करता है।

आपकी double संपत्ति के मामले में, यह data-val-number विशेषता ( data-val-required विशेषता के अलावा) को जोड़ देगा, जो उस number नियम को जोड़ देगा जिसे परिभाषित किया गया है

// http://docs.jquery.com/Plugins/Validation/Methods/number
number: function( value, element ) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
},

जहां दशमलव विभाजक एक बिंदु है, और हजारों विभाजक एक अल्पविराम है (संभवतः क्योंकि प्लगइन यूएस में विकसित किया गया था, इसलिए यूएस प्रारूप का उपयोग करता है)।

आपको डिफ़ॉल्ट व्यवहार को अधिलेखित करने की आवश्यकता है जो आप jquery.globalize जैसे प्लगइन्स का उपयोग करके कर सकते हैं, या निम्न स्क्रिप्ट सहित (ध्यान दें कि regex बस डॉट और अल्पविराम स्वैप करता है)

$.validator.methods.number = function (value, element) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)?(?:,\d+)?$/.test(value);
}

ध्यान दें कि उपरोक्त स्क्रिप्ट को jquery.validate.js स्क्रिप्ट के बाद होना चाहिए लेकिन $(document).ready() में लिपटा हुआ नहीं है। पहले से ही $(document).ready()

मेरे लिए इसे MVC से [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] है, यह तथ्य है कि मैं [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] में लाइन [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] को जोड़कर दिनांक सत्यापन समस्या को हल कर सकता हूं।

इसका वास्तव में आपका [DataType(DataType.Date)] [DisplayFormat] विशेषता के साथ संयोजन में विशेषता है जो उत्पन्न होने वाले HTML को प्रभावित कर रहा है। [DataType] विशेषता <input type="date" ... /> उत्पन्न करती है, जो बदले में ब्राउज़र HTML-5 डेटापिक को प्रदान करती है यदि ब्राउज़र इसका समर्थन करता है। विनिर्देशों के अनुसार प्रारूप में yyyy-MM-dd (ISO प्रारूप) होना चाहिए इसलिए [DisplayFormat] विशेषता की भी आवश्यकता है।

HTML-5 डेटापिक ब्राउज़र संस्कृति में तारीख का प्रतिपादन करता है। आपने जो चित्र दिखाया है, वह इनपुट 26.1.2018 है क्योंकि आपकी ब्राउज़र संस्कृति de-DE , लेकिन अगर मैंने आपकी साइट पर नेविगेट किया है, तो मुझे इनपुट में 26/1/2018 दिखाई 26/1/2018 क्योंकि मेरी संस्कृति en-AU (ऑस्ट्रेलियाई है) ), और यदि कोई संयुक्त राज्य उपयोगकर्ता आपकी साइट पर नेविगेट करता है, तो उन्हें 1/26/2018 दिखाई देगा।

डेट प्रॉपर्टी के लिए क्लाइंट साइड सत्यापन का कारण यह है कि jquery.validate.js प्लगइन में यूएस प्रारूप ( MM/dd/yyyy ) और ISO प्रारूप ( yyyy-MM-dd ) दोनों के लिए तिथि नियम शामिल हैं।

और यदि आप @Html.TextBoxFor(m => m.Inbetriebnahmedatum) (जो आपके [DataType] और [DisplayFormat] विशेषताएँ उपेक्षा करता है @Html.TextBoxFor(m => m.Inbetriebnahmedatum) का उपयोग करने के लिए थे, और इनपुट में 26.1.2018 को प्रवेश किया, तो आपको क्लाइंट साइड सत्यापन त्रुटि भी दिखाई देगी। ।


एक और अधिक मजबूत समाधान हो सकता है कि अपने स्वयं के फ़ंक्शन में सत्यापनकर्ता विधियों को लपेटें जो आपकी अल्पविराम से अलग की गई संख्या को दशमलव अलग कर देता है।

एक चाल का उपयोग करना है। मूल सत्यापनकर्ता फ़ंक्शन को कॉल करने के लिए जैसे कि "यह" मूल था जिसे डेवलपर्स ने सोचा था (जैसे वे अपने चरण सत्यापन के लिए एक फ़ंक्शन "this.optional" का उपयोग करते हैं)।

var originalNumber = $.validator.methods.number;
var wrappedNumber = function (value, element) {
    var fixedValue = parseFloat(value.toString().replace(",", "."));
    return originalNumber.call($.validator.prototype, fixedValue, element);     // Call function as if "this" is the original caller
};
$.validator.methods.number = wrappedNumber;

आप किसी सत्यापनकर्ता के लिए यह काम कर सकते हैं, उदाहरण के लिए चरण सत्यापन:

var originalStep = $.validator.methods.step;
var wrappedStep = function (value, element, param) {
    var fixedValue = parseFloat(value.toString().replace(",", "."));
    return originalStep.call($.validator.prototype, fixedValue, element, param);
};
$.validator.methods.step = wrappedStep;




asp.net-core