2012-06-28 5 views
8

asp.net mvc 응용 프로그램에서이 문제가 발생합니다.C#에서 텍스트 영역의 줄 바꿈 문자로 인해 텍스트 길이가 늘어납니다.

내 모델 중 하나에 "설명"필드가 있습니다. 이 필드의 데이터베이스 열은 NVarchar(300)으로 설정됩니다.

제 생각에는 다음과 같이 텍스트 영역을 만듭니다.

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

클라이언트 측 유효성 검사를 위해 "jquery.validate.unobtrusive.min.js"를 사용하고 있습니다. 따라서 사용자가 텍스트 영역에 텍스트를 입력하고 내용의 길이가 300자를 초과하면 "300자를 넘지 않는 문자를 입력하십시오."라는 메시지가 표시됩니다.

다음과 같은 sceanario가 올 때까지 모든 것이 잘 작동합니다. 사용자가 텍스트 영역에 다음 데이터를 입력합니다.

f 
f 
f 
f 
f 
f 
f 
f 
sdfa 

(콘텐츠 8 개 새로운 라인을 가짐)

은 "방해"유효성에 따라 콘텐츠 길이 300 (단일 문자로서 "n \"각각의 새로운 라인을 카운트) 그렇게 검증이 패스를 가지고 및 페이지 포스트. 인코딩에 의한 내 C# 코드에서

는 동일한 콘텐츠 길이 fo를해진다 308 (각각의 새로운 라인을 카운팅 "\ r은 n \"2 개의 문자) 제비의 데이터베이스 동작 실패 그것이 300을 허용하는 문자.

누군가이 속성에 대해 StringLength 속성을 가져야한다고 말하면 다음과 같은 이유가 있습니다.

클라이언트 측 유효성 검사가이 특정 속성에 대해 발생하지 않으면 서버로 이동하고 모델이 유효하지 않으므로 오류 메시지와 함께 페이지로 돌아옵니다.

이 문제를 해결할 수있는 방법을 알려주십시오.

답변

3

jquery.validate.js를 포함시킨 후 자바 스크립트에 다음을 추가하여 클라이언트 유효성 검사에서 getLength에 대한 동작을 두 번 계산 뉴 라인으로 변경할 수 있습니다. 이렇게하면 서버 측 및 클라이언트 측 길이 메서드가 StringLength 특성을 사용할 수 있도록 일치하게됩니다 (StringLength 문제는 서버 및 클라이언트 유효성 검사 방법이 다르다는 것을 전제로합니다).

$.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 replacedValue = value.replace (/ (\ n)/gm, ""); return replacedValue.length;' 참고 : 코드 블록은 여하튼 두 개가 있어야하는 공간을 하나만 보여줍니다. – Ben

5

는 @ 크리스에 의해 솔루션에 대해 자세히 살펴 복용 후, 나는 이것이 @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); 

내가 크롬과 몇 IE 버전이 테스트하고 나를 위해 잘 작동 :
그래서 여기 내 솔루션입니다.

관련 문제