服务器端的Textarea和StringLength验证器将'enter'计为两个字符

时间:2011-09-12 14:50:58

标签: asp.net-mvc-3 validation

我在textarea上有StringLength验证器

[StringLength(10, ErrorMessage = "The {0} must be {1} characters or less")]

因此,当我按enter然后键入9个字符时,客户端验证不会显示任何错误;但是如果我提交表单,服务器验证会说有超过10个字符。

因此,在客户端enter表示一个字符,在服务器上表示两个字符。这是不一样的行为。

可能我需要实现我自己的验证器,对吧?

或者我可以使用任何验证器代替StringLength,以正确验证textarea内容长度吗?

3 个答案:

答案 0 :(得分:1)

为您的媒体资源添加属性

[RegularExpression(@"^[\s\S]{0,10}$",ErrorMessage="maximun length must be 10")]

然后在你看来

<%: Html.ValidationMessageFor(m => m.MyText) %>

答案 1 :(得分:1)

请在此处查看我的回答:New line characters in text area increases text length in C#

您可以通过将以下内容添加到JS某处来更改getLength的默认行为以重新计算换行符。

$.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);
};

答案 2 :(得分:0)

我最近遇到了同样的问题,但由于.Net代码和Sql Server都考虑将一个换行符视为两个字符,我最后更改了客户端逻辑,并将换行符视为两个字符:

$('textarea[maxlength]').keyup(function () {
    var lineBreaks = $(this).val().split('\n').length - 1;
    var charsUsed = $(this).val().length + lineBreaks;
    if (charsUsed >= maxlength) {
        $(this).val($(this).val().substr(0, maxlength - lineBreaks));
        charsUsed = maxlength;
    }            
    var remaining = maxlength - charsUsed;
    $('#MyCounter').html("<strong>" + remaining + "</strong> characters remaining");
});