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

时间:2012-06-28 08:49:25

标签: javascript asp.net-mvc validation textarea newline

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

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

在我看来,我正在创建一个文本区域。

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

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

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

f
f
f
f
f
f
f
f
sdfa

(此内容有8个新行)

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

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

如果有人说我应该对此特定属性有StringLength属性,我有以下原因没有。

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

请告诉我可能的解决办法是什么?

2 个答案:

答案 0 :(得分:6)

在仔细研究了@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);

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

答案 1 :(得分:3)

通过在包含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);
};