__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