2

视图模型:

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

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

4

1 回答 1

2

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-不显眼的 Ajax.aspx。这样做的缺点是记住使用您的属性而不是标准的 StringLength 之一。你必须决定什么最适合你的情况。

于 2012-11-21T14:18:46.940 回答