2012-06-28 74 views
8

Tôi gặp sự cố này trong ứng dụng mvc asp.net của mình.Các ký tự dòng mới trong vùng văn bản tăng độ dài văn bản trong C#

Trong một mô hình của tôi, có một trường "Mô tả". Cột cơ sở dữ liệu cho các trường này được đặt thành NVarchar(300).

Theo quan điểm của tôi, tôi đang tạo một vùng văn bản như sau.

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

Tôi đang sử dụng "jquery.validate.unobtrusive.min.js" để xác thực phía máy khách. Vì vậy, khi người dùng nhập văn bản và độ dài nội dung dài hơn 300 ký tự, nó hiển thị thông báo "Vui lòng nhập không quá 300 ký tự".

Mọi thứ hoạt động tốt cho đến khi sceanario sau đến. Người dùng nhập dữ liệu sau vào vùng văn bản.

f 
f 
f 
f 
f 
f 
f 
f 
sdfa 

(nội dung này có 8 dòng mới)

Theo xác nhận "phô trương" nội dung này có chiều dài 300 (đếm từng dòng sản phẩm mới "\ n" như một nhân vật duy nhất) để xác nhận đi và trang đăng lại.

Trong mã C# của tôi, do mã hóa, cùng một nội dung trở thành fo chiều dài 308 (Đếm mỗi dòng mới "\ r \ n" là 2 ký tự) trong tern không hoạt động cơ sở dữ liệu vì nó chỉ cho phép 300 nhân vật.

Nếu ai đó nói rằng tôi cần có thuộc tính StringLength trên thuộc tính cụ thể này, tôi có lý do sau đây để không có nó.

Nếu tôi đặt thuộc tính này, xác thực phía máy khách không xảy ra cho thuộc tính cụ thể này, nó đi tới máy chủ và vì mô hình không hợp lệ, nó quay lại trang có thông báo lỗi.

Vui lòng cho tôi biết giải pháp có thể là gì?

Trả lời

3

Bạn có thể thay đổi hành vi của getLength trong xác thực ứng dụng để đếm hai dòng mới bằng cách thêm phần sau vào javascript của bạn sau khi bạn đã bao gồm jquery.validate.js. Điều này sẽ làm cho các phương thức chiều dài phía máy chủ và phía máy khách khớp với việc bạn sử dụng thuộc tính StringLength (tôi giả định rằng vấn đề của bạn với StringLength là các phương thức xác thực máy chủ và máy khách đã khác nhau).

$.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

Chia tách không hoàn toàn phù hợp với tôi. Tôi gặp sự cố với dấu ngắt dòng, không được tính bằng phương pháp của bạn. Tôi đã sử dụng thay thế này: '// thay thế các ký tự dòng mới bằng 2 dấu cách để làm cho số lượng phù hợp với máy chủ. var replaceValue = value.replace (/ (\ n)/gm, ""); return replaceValue.length; ' Lưu ý: khối mã bằng cách nào đó chỉ hiển thị một không gian nơi cần có hai. – Ben

5

Sau khi tham gia một cái nhìn sâu hơn về các giải pháp bởi @ Chris, tôi thấy rằng điều này sẽ gây ra một vòng lặp vô tận cho bất kỳ kiểm soát khác hơn textarea với thuộc tính @maxlength.
Hơn nữa, tôi thấy rằng việc sử dụng value (= giá trị của vùng văn bản được chuyển vào trình xác thực) sẽ bị ngắt dòng đầu và cuối, nghĩa là thao tác cơ sở dữ liệu vẫn không thành công khi cố lưu văn bản chứa các ngắt dòng đó.
Vì vậy, đây là giải pháp của tôi:

(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); 

Tôi thử nghiệm này trong Chrome và một vài phiên bản IE và nó làm việc tốt cho tôi.

Các vấn đề liên quan