2012-06-28 14 views
8

में टेक्स्ट की लंबाई बढ़ाता है मुझे यह एएसपीनेट एमवीसी एप्लिकेशन में यह समस्या है।टेक्स्ट क्षेत्र में नई पंक्ति वर्ण सी #

मेरे मॉडल में से एक में "विवरण" फ़ील्ड है। इस फ़ील्ड के लिए डेटाबेस कॉलम NVarchar(300) पर सेट है।

मेरे विचार में मैं निम्नलिखित के रूप में एक टेक्स्ट क्षेत्र बना रहा हूं।

@Html.TextAreaFor(m => m.Description, new { maxlength = "300" }) 

मैं "jquery.validate.unobtrusive.min.js" का उपयोग कर रहा क्लाइंट साइड सत्यापन के लिए। तो जब टेक्स्टरेरा में उपयोगकर्ता प्रकार और सामग्री की लंबाई 300 से अधिक वर्णों में जाती है तो यह संदेश प्रदर्शित करती है "कृपया 300 से अधिक characaters दर्ज करें।"

सब कुछ ठीक सागरियो आने तक ठीक काम करता है। उपयोगकर्ता टेक्स्ट क्षेत्र में डेटा का पालन करता है।

f 
f 
f 
f 
f 
f 
f 
f 
sdfa 

(इस सामग्री 8 नई लाइनों है)

"विनीत" सत्यापन के अनुसार इस सामग्री लंबाई 300 (प्रत्येक नई लाइन की गिनती "\ n" एक ही चरित्र के रूप में) तो सत्यापन गुजरता है और पेज पोस्ट वापस।

मेरी सी # कोड में, एन्कोडिंग की वजह से, एक ही सामग्री की लंबाई के लिए हो जाता है 308 (प्रत्येक नई लाइन की गिनती "\ r \ n" के रूप में 2 अक्षर) जो टैन में डेटा बेस ऑपरेशन विफल रहता है यह केवल 300 की अनुमति देता है के रूप में वर्ण।

अगर कोई यह कह रहा है कि मेरे पास इस विशेष संपत्ति पर StringLength विशेषता होनी चाहिए, तो मेरे पास यह नहीं होने का निम्नलिखित कारण है।

यदि मैं इस विशेषता को डालता हूं तो क्लाइंट-साइड सत्यापन इस विशेष संपत्ति के लिए नहीं होता है, यह सर्वर पर जाता है और चूंकि मॉडल मान्य नहीं है, यह त्रुटि संदेश वाले पृष्ठ पर वापस आता है।

कृपया मुझे सलाह दें कि इसके लिए संभावित समाधान क्या हो सकता है?

उत्तर

3

आप jquery.validate.js को शामिल करने के बाद अपने जावास्क्रिप्ट में निम्न जोड़कर क्लाइंट सत्यापन में गेटलाइंड के लिए व्यवहार को बदल सकते हैं। यह सर्वर-साइड और क्लाइंट-साइड लम्बाई विधियों का कारण बनने के लिए आपको स्ट्रिंग लम्बाई विशेषता का उपयोग करने के लिए मिलान करेगा (मुझे लगता है कि स्ट्रिंग लम्बाई के साथ आपकी समस्या यह थी कि सर्वर और क्लाइंट सत्यापन विधियां भिन्न थीं)।

$.validator.prototype._getLength = $.validator.prototype.getLength; 
$.validator.prototype.getLength = function (value, element) { 
// Double count newlines in a textarea because they'll be turned into \r\n by the server. 
    if (element.nodeName.toLowerCase() === 'textarea') 
     return value.length + value.split('\n').length - 1; 
    return this._getLength(value, element); 
}; 
+0

विभाजन मेरे लिए काफी काम नहीं करता था। मुझे पिछली लाइन ब्रेक के साथ समस्या थी, जिसे आपकी विधि का उपयोग करके गिना नहीं गया था। मैंने इसके बजाय इसका उपयोग किया: '// गिनती को सर्वर से मेल करने के लिए 2 रिक्त स्थान वाले न्यूलाइन वर्णों को प्रतिस्थापित करता है। var replaceValue = value.replace (/ (\ n)/gm, ""); बदले बदले वैल्यू। लम्बाई; ' नोट: कोड ब्लॉक किसी भी तरह से केवल एक स्थान दिखाता है जहां दो होना चाहिए। – Ben

5

@Chris द्वारा समाधान को करीब से देख लेने के बाद, मैंने पाया है कि यह किसी भी @maxlength विशेषता के साथ पाठ क्षेत्र के अलावा अन्य नियंत्रण के लिए एक अंतहीन लूप का कारण होगा।
इसके अलावा, मैंने पाया कि value (= सत्यापनकर्ता में पास किए गए टेक्स्टरेरा का मूल्य) पहले से ही अग्रणी और पिछली रेखा ब्रेक काट देगा, जिसका मतलब है कि डेटाबेस लाइन ऑपरेशन तब भी विफल रहा जब उन्होंने उन लाइन ब्रेक वाले टेक्स्ट को सहेजने का प्रयास किया।

(function ($) { 
    if ($.validator) { 
     //get the reference to the original function into a local variable 
     var _getLength = $.validator.prototype.getLength; 

     //overwrite existing getLength of validator 
     $.validator.prototype.getLength = function (value, element) { 

      //double count line breaks for textareas only 
      if (element.nodeName.toLowerCase() === 'textarea') { 

       //Counts all the newline characters (\r = return for macs, \r\n for Windows, \n for Linux/unix) 
       var newLineCharacterRegexMatch = /\r?\n|\r/g; 

       //use [element.value] rather than [value] since I found that the value passed in does cut off leading and trailing line breaks. 
       if (element.value) { 

        //count newline characters 
        var regexResult = element.value.match(newLineCharacterRegexMatch); 
        var newLineCount = regexResult ? regexResult.length : 0; 

        //replace newline characters with nothing 
        var replacedValue = element.value.replace(newLineCharacterRegexMatch, ""); 

        //return the length of text without newline characters + doubled newline character count 
        return replacedValue.length + (newLineCount * 2); 
       } else { 
        return 0; 
       } 
      } 
      //call the original function reference with apply 
      return _getLength.apply(this, arguments); 
     }; 
    } 
})(jQuery); 

मैं क्रोम और कुछ आईई संस्करण में इस परीक्षण किया है और यह मेरे लिए ठीक काम किया:
तो यहाँ मेरी समाधान है।

संबंधित मुद्दे