[英]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.