Jquery 带ASP.NET的AJAX:如何使用AJAX调用用户控件的方法?

Jquery 带ASP.NET的AJAX:如何使用AJAX调用用户控件的方法?,jquery,asp.net,ajax,user-controls,Jquery,Asp.net,Ajax,User Controls,我有一个母版页,它有一个占位符来生成Default.aspx Default.aspx定义一个用户控件: <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <uc:maincontent ID="maincontent" runat="server" /> </asp:Content> 然后,我想调用一个方法,在User Controlco

我有一个母版页,它有一个占位符来生成
Default.aspx
Default.aspx
定义一个
用户控件

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <uc:maincontent ID="maincontent" runat="server" />
</asp:Content>
然后,我想调用一个方法,在
User Control
code-behind中定义:

[System.Web.Services.WebMethod]
public static string GeneratePdfs()
{
    string test = "Test String";
    return test;
}
为此,我有以下
jQuery
code:

$('#btnGenerate').click(function () {

    if (!ValidateInput()) {
        return false;
    }

    $.ajax({
        type: "POST",
        url: "????"
        .....
    });
我还使用以下代码创建了一个
通用处理程序
。我在stackoverflow上找到了这个例子

public void ProcessRequest (HttpContext context) {

    using (var writer = new System.IO.StringWriter())
    {
        Page pageHolder = new Page();
        var control = (UserControl)pageHolder.LoadControl("~/controls/maincontent.ascx");
        pageHolder.Controls.Add(control);
        context.Server.Execute(pageHolder, writer, false);
        context.Response.ContentType = "text/html";
        context.Response.Write(writer.GetStringBuilder().ToString());
    }
}
但是这个例子没有解释如何调用我的
用户控件中定义的
Web方法


完成这样的事情的正确方法是什么?

你做得不好。将用户控制的逻辑抽象为用户控制可以调用且AJAX处理程序可以调用的方法。AJAX和Web表单控件没有很好地结合在一起。那么有什么更好的方法呢?我应该在ASP.NET AJAX中使用
更新面板
?或者我应该只创建一个简单的
html
页面而不使用ASPX页面吗?亲爱的上帝,不,永远不要使用UpdatePanel。ASPX很好,但是AJAX调用不应该依赖于对控件的操作。那么我该怎么做呢。不要使用
用户控件
,直接将其内容放入
Default.aspx
页面,然后从那里调用AJAX?想想AJAX控件应该完成什么。作为一个用户控件,这种逻辑真的有意义吗?
public void ProcessRequest (HttpContext context) {

    using (var writer = new System.IO.StringWriter())
    {
        Page pageHolder = new Page();
        var control = (UserControl)pageHolder.LoadControl("~/controls/maincontent.ascx");
        pageHolder.Controls.Add(control);
        context.Server.Execute(pageHolder, writer, false);
        context.Response.ContentType = "text/html";
        context.Response.Write(writer.GetStringBuilder().ToString());
    }
}