繁体   English   中英

使用ASP MVC和jquery非侵入式验证处理textarea元素中的换行符

[英]Handling line breaks in textarea elements with ASP MVC and jquery unobtrusive validation

视图模型:

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规范的理解是,它被编码为CR LF。 这肯定是我在调试处理该视图模型后的控制器动作时看到的。

但是,通过javascript读取输入值时,换行符因浏览器而异(IE6-8似乎为CRLF,而最近在Windows上构建的Chrome和Firefox仅提供LF)。

这意味着,如果您输入带换行符的文本,jQuery验证程序将让他们看穿498个字符,但是到到达模型绑定时,它已被转换为504和ModelState.IsValid(正确)假。

任何人都知道有关纠正此问题的最好/最简单方法的想法吗?

MVC非侵入式验证(jquery.validate.unobtrusive.js)使用了jquery.validate.js。

因此,解决此问题的最简单方法是更改​​maxlength在jquery.validate.js中的行为(这是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。 您必须决定最适合自己的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM