使用ASP MVC和jquery不显眼的验证处理textarea元素中的换行符

时间:2012-11-21 13:53:00

标签: jquery asp.net asp.net-mvc asp.net-mvc-3 jquery-validate

视图模型:

public class ViewModel
{
    [Display(Name = "Message")]
    [StringLength(500, ErrorMessage = "Your message must be {1} characters or fewer.")]
    public string Message { get; set; }
}

查看(摘录):

<div class="form-field-group">
    @Html.LabelFor(m => m.Message , "Your message:")
    @Html.TextAreaFor(m => m.Message )
    @Html.ValidationMessageFor(m => m.Message )
</div>

我也在web.config中使用这种不引人注意的验证:

<appSettings>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>

绝对是教科书的东西,它似乎工作得非常好。

问题!

所以我对HTML spec for line breaks in form data的理解是它被编码为CR LF。当我调试处理此视图模型的帖子的控制器操作时,这肯定是我所看到的。

然而,当通过javascript读取输入的值时,换行符取决于浏览器(IE6-8似乎提供CRLF,而Chrome和Firefox最近构建在Windows上只提供LF)。

这意味着如果输入带换行符的文本,jquery验证器将通过他们所看到的498个字符,但是当它到达模型绑定时,它已被转换为504并且ModelState.IsValid是(正确)错误。

有人对最好/最简单的纠正方法有任何想法吗?

1 个答案:

答案 0 :(得分:1)

MVC unobtrusive validation(jquery.validate.unobtrusive.js)使用jquery.validate.js。

因此解决此问题的最简单方法是更改​​jquery.validate.js中maxlength的行为(这是jquery.validate.unobtrusive.js通过它的适配器附加的内容)。

以下代码将更改maxlength并解决问题:

(function ($) {

    if ($.validator && $.validator.methods && $.validator.methods.maxlength) {

        $.validator.methods.maxlength = function (value, element, param) {
            if (typeof value === 'string') {
                value = value.replace(/\r?\n/g, "\r\n");
            }

            var length = $.isArray(value) ? value.length : $.validator.prototype.getLength($.trim(value), element);
            return $.validator.prototype.optional(element) || length <= param;
        };
    }

})(jQuery);

需要注意的是,这不会导致非Windows平台出现问题(或导致不同的问题)http://en.wikipedia.org/wiki/Newline

您还可以通过创建自己的验证属性并实现IClientValidatable来添加您自己的客户端验证http://www.falconwebtech.com/post/2012/04/21/MVC3-Custom-Client-Side-Validation-with-Unobtrusive-Ajax.aspx来解决此问题。这样做的缺点是要记住使用属性而不是标准的StringLength属性。你必须决定什么是最适合你的情况。