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

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

View 模型:

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。这肯定是我在调试处理此 View 模型的帖子的 Controller 操作时所看到的。

但是,当通过 javascript 读取输入的值时,换行符会根据浏览器的不同而有所不同(IE6-8 似乎给出 CRLF,而 Windows 上的 Chrome 和 Firefox 最近版本只给出 LF)。

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

有人知道纠正这个问题的最好/最简单的方法吗?

最佳答案

MVC 不显眼的验证 (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 属性。您必须决定什么最适合您的情况。

关于jquery - 使用 ASP MVC 和 jquery 不显眼的验证处理 textarea 元素中的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13494779/

相关文章:

javascript - 等待 JQuery div 加载

c# - 采访: how to get last clicked option at the top across all sessions for a particular user in C# asp.网?

asp.net - 访问发布到 ASP.Net 的内容安全策略违规报告

asp.net-mvc - 如何删除 mvc 中带有选定选项标签的下拉菜单的模型状态错误?

c# - 获取 MVC 包查询字符串

.net - 如何创建 bool 编辑器模板? (.EditorFor<>)

jquery - jquery中textarea的字符数限制

如果匹配特定单词,Javascript 大写前 x 个字符?

javascript - jquery/ajax 使用用户输入作为条件运行 php 查询,然后显示查询结果而不刷新页面

c# - 如何使用 jQuery 淡入服务器控件?