ASP.NET MVC客户端验证陷入无限循环

时间:2011-02-01 14:16:38

标签: javascript asp.net-mvc-2 validation infinite-loop

我们在MVC2项目中遇到客户端验证问题。

有一个包含以下属性的视图模型

[Required(ErrorMessage = "First Name is required")]
public string FirstName { get; set; }

在相应的视图中我们有

<% using (Html.BeginForm("Save", "User", FormMethod.Post))
   {
%>
<!-- code removed -->
<%= Html.ValidationMessageFor(model => model.UserInfo.FirstName)%>
<%= Html.TextBoxFor(model => model.UserInfo.FirstName)%>
<!-- code removed -->
<% } %>

当用户点击表单提交按钮并且FirstName为空时,会出现问题。浏览器(在这种情况下是IE8)挂起,在无限循环中执行JavaScript。

如果我们删除Required属性,则不会出现问题(但当然我们没有看到验证错误消息)。

JavaScript的违规部分位于MicrosoftAjax.debug.js,位于函数

var $addHandler = Sys.UI.DomEvent.addHandler = function Sys$UI$DomEvent$addHandler(element, eventName, handler) {

在下一节中。有关详细信息,请参阅内联注释

else if (element.attachEvent) {
    browserHandler = function() {
        var e = {}; // we end up back here...
        try {e = Sys.UI.DomElement._getWindow(element).event} catch(ex) {}
        return handler.call(element, new Sys.UI.DomEvent(e)); // ...when this line executes
    }
    element.attachEvent('on' + eventName, browserHandler);
}

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

经过一些调查,发现这个问题是由于表格的TextBoxFor位于HTML表格内而发生的(是的,布局表格 - 这个页面是十年之久的asp的副本正在被淘汰的页面。)

对此的修复是添加style = "table-layout:fixed;"声明添加<table>的解决方法。

更多详细信息位于http://forums.asp.net/p/1515784/3826207.aspx