视图模型:
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是(正确)错误。
有人对最好/最简单的纠正方法有任何想法吗?
答案 0 :(得分:1)
MVC unobtrusive validation(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属性。你必须决定什么是最适合你的情况。