Javascript 从用户控件调用web服务时,asp.net页为空
我有一个名为“DynamicGrid”的用户控件,它用于在分配数据集时在各个页面上创建动态网格。网格具有用于编辑/插入数据的文本框。现在我得到了一个要求,每当用户在网格的最后一个文本框中点击enter时,它都应该在网格中输入一个新行,这个功能以前是通过按钮的单击事件实现的。所以我把一些javascript连接到最后一个文本框,就像这样Javascript 从用户控件调用web服务时,asp.net页为空,javascript,c#,asp.net,web-services,user-controls,Javascript,C#,Asp.net,Web Services,User Controls,我有一个名为“DynamicGrid”的用户控件,它用于在分配数据集时在各个页面上创建动态网格。网格具有用于编辑/插入数据的文本框。现在我得到了一个要求,每当用户在网格的最后一个文本框中点击enter时,它都应该在网格中输入一个新行,这个功能以前是通过按钮的单击事件实现的。所以我把一些javascript连接到最后一个文本框,就像这样 if (gv != null && gv.Rows.Count > 0) { GridViewRow lastRow = gv.Ro
if (gv != null && gv.Rows.Count > 0)
{
GridViewRow lastRow = gv.Rows[gv.Rows.Count - 1];
var controls = lastRow.Controls[lastRow.Controls.Count - 1].Controls[0];
TextBox txtbx = ((TextBox)lastRow.Controls[lastRow.Controls.Count - 1].Controls[0].Controls[0]);
string script = string.Format(@"
$(document).ready(function () {{
$('#{0}').bind('keyup', function (e) {{
{{
if (e.keyCode === 13) {{
{{
$('#{0}').css('border', '1px dashed red');
$.ajax({{
type: 'POST',
url: '{1}',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
async: false,
data: '{{ GridViewID: ""{2}"" }}',
success: function (data) {{
alert(data.d);
}},
error: function (xhr) {{
alert('An error occurred: ' + xhr.status + ' ' + xhr.statusText + ' ' + xhr.responseText);
}}
}});
}}
}}
}}
}});
}});", txtbx.ClientID, "../../../WebService/DynamicGridAddRow.asmx/AddNewRow", gv.ClientID);
ScriptManager.RegisterClientScriptBlock(this, Page.GetType(), "script", script, true);
}
在我的webservice上,我使用委托来调用以前在button click事件中使用的addrow方法
[WebMethod]
public void AddNewRow(string GridViewID)
{
wucDynamicGrid dynamicGrid = new App_Controls.wucDynamicGrid();
AddNewRowToDynamicGrid newRow = new App_Controls.AddNewRowToDynamicGrid(dynamicGrid.addRow);
newRow(GridViewID);
}
这是添加新方法
public void addRow(string GridID)
{
//GridView gv = (GridView)this.Page.FindControl(GridID);
Page p = HttpContext.Current.Handler as Page;
var controls = APP_Common.CommonFunctions.FindControl<GridView>(this.NamingContainer.Controls);
GridView gv = controls;
AddNewRowToDynamicGrid(gv);
}
public void addRow(字符串GridID)
{
//GridView gv=(GridView)this.Page.FindControl(GridID);
页面p=HttpContext.Current.Handler作为页面;
var controls=APP_Common.CommonFunctions.FindControl(this.NamingContainer.controls);
GridView gv=控件;
AddNewRowToDynamicGrid(gv);
}
问题是页面总是空的,父、NamingContainer和HttpContext.Current.Handler属性也是空的。我需要根据ID找到动态添加的网格,以便添加新行。我被困在这里两天了,我知道这里犯了一个非常基本的错误,请指导我在对此进行了一些研究之后,我决定不将web服务用作
HttpContext。Current.CurrentHandler
是一个web服务处理程序,因为此方法是由web服务调用的。我搜索并将其配置为使用当前页面,但无法执行此操作。然后,我使用手动Postback
执行相同的功能,检查网格中最后一行的最后一个文本框,并将它们放入会话中。现在,在我的页面的Page\u LoadComplete
中,我通过ScriptManager.RegisterStartupScript
将它们放在页面上,并使用\u doPostBack
将所需数据发布到我的方法中
if (e.keyCode === 13) {{
$('#{0}').css('border', '1px dashed green');
__doPostBack('{1}', '{2}');
}}
添加了一个按钮,这样我就可以从上面的代码生成合法的部分回发
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnHiddenNewRowAdd" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<asp:Button ID="btnHiddenNewRowAdd" runat="server" style="display:none;" />
现在我认为当请求从Web服务生成时搜索页面是愚蠢的,它与页面生命周期无关,所以这就是为什么没有
Page
、Parent
或NamingContainer
。我之所以选择web服务,是因为我以前没有使用过\uu doPostBack
。感谢您的快速响应,这与我的问题并不完全相关,因为页面已完全加载(用户控件也是如此)。我想我需要以某种方式配置我的web服务以访问页面,但如何:(
string eventTarget = Request.Form["__EVENTTARGET"];
if (eventTarget != null && eventTarget.Length > 0 )
{
string parameter = Request.Form["__EVENTARGUMENT"];
if (parameter != null && parameter.Length > 0)
addRow(parameter);
}