Проверка на стороне клиента ASP.NET MVC застряла в бесконечном цикле - PullRequest
1 голос
/ 01 февраля 2011

У нас проблема с проверкой на стороне клиента в проекте 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 Ответ

1 голос
/ 04 февраля 2011

После некоторого исследования было обнаружено, что эта проблема возникает из-за TextBoxFor формы, находящейся в таблице HTML (да, таблицы для макета - эта страница является копией десятилетней страницы asp,был снят с производства).

Исправление для этого состояло в том, чтобы добавить обходной путь добавления style = "table-layout:fixed;" к объявлению <table>.

Некоторые дополнительные сведения приведены в http://forums.asp.net/p/1515784/3826207.aspx

...