【问题标题】:asp.net page is null when a web service is called from user control当从用户控件调用 Web 服务时,asp.net 页面为空
【发布时间】:2015-03-11 02:46:05
【问题描述】:

我有一个名为“DynamicGrid”的用户控件,它用于在分配数据集时在各个页面上制作动态网格。网格具有用于编辑/插入数据的文本框。现在我有一个要求,每当用户在 Grid 的最后一个文本框输入时,它应该在其网格中输入一个新行,此功能以前是通过按钮的单击事件实现的。所以我像这样在最后一个文本框上连接了一些 javascript

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

在我的网络服务中,我使用委托来调用之前在按钮单击事件中使用的 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);
}

问题是 Page 始终为 null,Parent、NamingContainer 和 HttpContext.Current.Handler 属性也是如此。我需要通过 ID 找到动态添加的 Grid,以便我可以添加新行.我被困了2天,我知道这里犯了一个非常基本的错误,请指导我

【问题讨论】:

  • 感谢您的快速响应,由于页面已完全加载(用户控件也是如此),因此与我的问题并不完全相关
  • 我想我需要以某种方式配置我的网络服务才能访问该页面,但是如何:(

标签: javascript c# asp.net web-services user-controls


【解决方案1】:

在对此进行一些研究后,我决定不使用 Web 服务,因为 HttpContext.Current.CurrentHandler 是一个 Web 服务处理程序,因为此方法是由 Web 服务调用的。我搜索将其配置为使用当前页面,但不能这样做。然后我使用手册 Postback 来执行相同的功能,检查我的网格中 lastRow 的最后一个文本框并将它们放入会话中。现在在我的页面的Page_LoadComplete,我已经通过ScriptManager.RegisterStartupScript 将它们放在页面上,并使用__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;" /> 

然后在名为“DynamicGrid”的用户控件的页面加载中,我检查了 MS ajax__EVENTTARGET__EVENTARGUMENT 创建的隐藏字段并调用了 addoRow 方法

string eventTarget = Request.Form["__EVENTTARGET"];
if (eventTarget != null && eventTarget.Length > 0 )
{
    string parameter = Request.Form["__EVENTARGUMENT"];
    if (parameter != null && parameter.Length > 0)
        addRow(parameter);
}

现在我认为从 Web 服务生成请求时搜索页面是愚蠢的,它与页面生命周期无关,所以这就是为什么没有 PageParent 或 @987654333 @。因为我之前没有使用过__doPostBack,所以我打算使用网络服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多