【问题标题】:Handling line breaks in textarea elements with ASP MVC and jquery unobtrusive validation使用 ASP MVC 和 jquery 不显眼验证处理 textarea 元素中的换行符
【发布时间】:2012-11-21 13:52:59
【问题描述】:

视图模型:

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 是(正确)错误。

有人对纠正这个问题的最佳/最简单方法有任何想法吗?

【问题讨论】:

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


    【解决方案1】:

    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 之一。您必须决定什么最适合您的情况。

    【讨论】:

    • 干杯。这行得通。通过未来的 jquery 验证升级来维护它会很烦人。我可能会看看他们是否关心这个。
    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2012-03-03
    • 1970-01-01
    相关资源
    最近更新 更多