我有一个网页(.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
例外。