文本区域中的换行符增加了C#中的文本长度

Che*_*iya 10 javascript validation asp.net-mvc textarea newline

我在asp.net mvc应用程序中遇到此问题.

在我的一个模型中有一个字段"描述".此字段的数据库列设置为NVarchar(300).

在我看来,我正在创建一个文本区域如下.

@Html.TextAreaFor(m => m.Description, new { maxlength = "300" })
Run Code Online (Sandbox Code Playgroud)

我正在使用"jquery.validate.unobtrusive.min.js"进行客户端验证.因此,当textarea中的用户类型和内容长度超过300个字符时,它会显示消息"请输入不超过300个字符".

一切正常,直到下面的情景来临.用户在文本区域中输入以下数据.

f
f
f
f
f
f
f
f
sdfa
Run Code Online (Sandbox Code Playgroud)

(此内容有8条新线)

根据"不显眼"验证,此内容的长度为300 (将每个新行"\n"计为单个字符),以便验证通过并返回页面帖子.

在我的C#代码中,由于编码,相同的内容变为长度308 (将每个新行"\ r \n"计为2个字符),这使得数据库操作失败,因为它只允许300个字符.

如果有人说我应该拥有StringLength这个特定属性,我有以下原因没有它.

如果我将此属性设置为此特定属性不会发生客户端验证,则会转到服务器,因为模型无效,所以它会返回到包含错误消息的页面.

请告诉我可能的解决方案是什么?

Ben*_*Ben 7

在仔细研究了@Chris的解决方案之后,我发现除了带有@maxlength属性的textarea之外,这将导致无限循环.
此外,我发现使用value(=传递给验证器的textarea的值)已经将前导和尾部换行符切断,这意味着当它试图保存包含这些换行符的文本时数据库操作仍然失败.
所以这是我的解决方案:

(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);
Run Code Online (Sandbox Code Playgroud)

我在Chrome和一些IE版本中对此进行了测试,它对我来说很好用.


Chr*_*ris 4

在包含 jquery.validate.js 后,您可以通过将以下内容添加到 javascript 来更改客户端验证中 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);
};
Run Code Online (Sandbox Code Playgroud)