0

我使用了这个示例并在 ascx 控件中创建了一个表单。

http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/

问题是,每当我放置一个 asp.net 按钮或更新面板时,ascx 都不会加载。可能是什么问题呢?

4

3 回答 3

1

我发现您需要将控件放在 HtmlForm 类中,然后将 HtmlForm 放在 Page 类中。

我正在重新使用 IFrame。也许我会以另一种方式使用这种技术。

感谢您的努力。

于 2009-08-10T01:10:40.103 回答
0

您是否在 Web 服务的方法中放置了一个断点,以查看它是否真的命中了 Web 服务?

我要研究的另一个选项是使用 XML 样式表,并仅使用样式表和 XML Server 控件转换此数据。与添加更新面板和调用 Web 服务进行转换相比,这将使用更少的开销。

此外,请检查以确保在您调用的页面上正确设置了您的脚本管理器。

在您的 aspx 中,确保您的代码类似于:

     <form id="form1" runat="server">
      <asp:ScriptManager runat="server">
        <Services>
          <asp:ServiceReference Path="~/RSSReader.asmx" />
        </Services>
        <Scripts>
          <asp:ScriptReference Path="~/Default.js" />
        </Scripts>
      </asp:ScriptManager>
     </form>
    <div id="Container">
      <div id="RSSBlock">
        <div id="RSSContent" class="loading"></div>
      </div>    
      <div id="Content">
      <p></p>
      </div>
    </div>

此外,他的教程没有提到这一点,但你必须在你的 web 服务的类上有这个属性才能从 javascript 调用它:

[System.Web.Script.Services.ScriptService]

除了这些想法,我还得看看你的代码。

于 2009-08-06T00:36:45.250 回答
0

谢谢你的提示。仍然,我得到了同样的错误:

“System.Web.HttpException:'Button' 类型的控件 'ctl00_Button1' 必须放在带有 runat=server 的表单标记内。”

我在动态 js JQuery 选项卡中加载控件。

$.ajax({
                type: "POST",
                url: "TabLoader.asmx/LoadNewTab",
                data: "{'fullname':'" + fullname +
                      "', 'id':'" + id + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(msg) {
                $(tabName).html(msg.d);
                }
            });

对于 asmx:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
[Serializable]
public class TabLoader : System.Web.Services.WebService
{
    private Page _page;

    [WebMethod]
    public string LoadNewTab(string fullname, string id)
    {
        _page = new Page();
        UserControl ctl = LoadControl("~/controls/ctrlTabContent.ascx", 
                                      fullname, 
                                      Convert.ToInt32(id));
        _page.Controls.Add(ctl);

        StringWriter writer = new StringWriter();
        HttpContext.Current.Server.Execute(_page, 
                                           writer, 
                                           false);

        return writer.ToString();
    }

    private UserControl LoadControl(string userControlPath, 
                                    params object[] constructorParams)
    {
        List<Type> constParamTypes = new List<Type>();
        foreach (object cp in constructorParams)
        {
            constParamTypes.Add(cp.GetType());
        }

        UserControl userCtrl = (UserControl)_page.LoadControl(userControlPath);
        ConstructorInfo constructor = userCtrl.GetType().BaseType.GetConstructor(constParamTypes.ToArray());
        if (constructor == null)
            throw new MemberAccessException("The requested constructor was not found on : " + userCtrl.GetType().BaseType.ToString());
        else
            constructor.Invoke(userCtrl, constructorParams);

        return userCtrl;
    }
}
于 2009-08-06T05:02:47.320 回答