1

我有一个网页(.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 Web 服务中,我有一个 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(criteria) 公共方法根据某些条件将其绑定到某些数据。

所有这些代码都可以正常工作。我已经多次使用这种技术并且它曾经工作得很好。

这一次,在将服务中的html加载到页面后,点击应该自动回发的控件(如asp:Button、asp:DropDownList、asp:CheckBoxList),抛出以下js esception: __EVENTTARGET is undefined

在这部分代码上:

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;
    }

但是没有任何具有这种 id 的表格,现在我得到:

theForm is undefined

例外。

4

2 回答 2

1

它仍然是未定义的。我也对此进行了测试,但有一些问题(至少在使用 ajax 时),按钮控件的 clientID 在回发时没有返回。相反,我也有一个输入字段和一个下拉菜单也会导致页面上的回发,这两个回发实际上返回了正确的 ID 字符串。它是特定于按钮控制的东西。

于 2013-06-05T20:55:27.663 回答
1

听起来可能很奇怪,但 ASP.NET 可能会错误检测 IE 10 和 11。这将导致它呈现带有 __doPostBack JavaScript 错误的页面。

一个简单的解决方法是在您的服务器上安装 .NET 4.5。如果这是不可能的(例如,如果它是 Window Server 2003),那么可以安装一些修补程序来纠正这个问题。请参考本站:

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

于 2014-04-28T11:36:06.367 回答