__EVENTTARGET не определено

У меня есть веб-страница (.aspx), на которой я загружаю некоторый пользовательский элемент управления jQuery ajax. Что-то вроде этого:

$.ajax({
            type: "POST",
            url: "WebService.asmx/GetGrid",
            data: data,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result){
                 $('#divAjaxGridViewContainer').html(result.d);
            },
            error: function(error) {
                alert("Error");
            }
        });

В веб-службе WebService.asmx.cs у меня есть GetGrid WebMethod, который генерирует и возвращает HTML-код пользовательского элемента управления, который содержит представление сетки. Вот код:

[WebMethod]
public string GetPage(object[] criteria)
{
    Page page = new Page {ViewStateMode = ViewStateMode.Disabled};

    AjaxGridView grid = (AjaxGridView)page.LoadControl("~/Controls/AjaxGridView.ascx");
    grid.ViewStateMode = ViewStateMode.Disabled;

    grid.BindData(criteria);

    HtmlForm form = new HtmlForm {ViewStateMode = ViewStateMode.Disabled};

    form.Controls.Add(grid);

    page.Controls.Add(form);

    string result = String.Empty;

    using (StringWriter output = new StringWriter())
    {
        page.Server.Execute(page, output, false);
        result = output.ToString();
    }
    return result;
}

AjaxGridView - это пользовательский элемент управления, который содержит GridView и привязывает его к некоторым данным в зависимости от некоторых критериев с помощью открытого метода BindData(критерии).

Весь этот код работает отлично. Я использовал эту технику несколько раз, и она работала нормально.

На этот раз, после загрузки html из службы на страницу, щелкнув элементы управления, которые должны сделать автоответчик (например, asp:Button, asp:DropDownList, asp:CheckBoxList), выдается следующее исключение js:__EVENTTARGET не определено

на этой части кода:

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

Есть идеи?

РЕДАКТИРОВАТЬ: Я понял что-то. theForm устанавливается следующим образом:

var theForm = document.forms['ctl00'];
if (!theForm) {
    theForm = document.ctl00;
}

Поскольку у меня есть форма в моем динамически генерируемом html, theForm ссылается на эту форму, которая не имеет __EVENTTARGET. Я решил удалить тег формы из сгенерированного HTML в сервисе:

if (!String.IsNullOrEmpty(result))
{
    Regex frmOpenFinder = new Regex("(<form)[^>]*>");

    Match frmOpen = frmOpenFinder.Match(result);
    string frm = frmOpen.Value;
    result = result.Replace(frm, "").Replace("</form>", "");
}

Но в этом случае TheForm снова

var theForm = document.forms['ctl00'];
    if (!theForm) {
        theForm = document.ctl00;
    }

Но нет такой формы с таким идентификатором, и теперь я получаю:

theForm is undefined

исключение.

2 ответа

Это все еще не определено. Я также проверил это, и есть что-то не так (по крайней мере, при использовании ajax), где clientID кнопки управления не возвращается в точке post back. Наоборот, у меня также было поле ввода, и выпадающий список также приводил к появлению поста на странице, и эти два постбэка фактически возвращались с правильной строкой идентификатора. Это что-то с кнопочным управлением в конкретном.

Это может звучать странно, но ASP.NET может неправильно определять IE 10 и 11. Это приведет к тому, что он отобразит страницу с ошибками __doPostBack JavaScript.

Простое решение - установить.NET 4.5 на ваш сервер. Если это невозможно (например, если это Window Server 2003), то для устранения проблемы можно установить некоторые исправления. Пожалуйста, обратитесь к этому сайту:

http://www.hanselman.com/blog/IE10AndIE11AndWindows81AndDoPostBack.aspx

Другие вопросы по тегам