我在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
属性,我有以下原因没有。
如果我将此属性设置为此特定属性不会发生客户端验证,则会转到服务器,因为模型无效,所以它会返回到包含错误消息的页面。
请告诉我可能的解决办法是什么?
答案 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);
};