我使用了这个例子并在ascx控件中创建了一个表单。
http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/
问题是,每当我放置一个asp.net按钮或更新面板时,ascx都不会加载。可能是什么问题呢?
答案 0 :(得分:1)
我发现你需要将控件放在HtmlForm类中,然后将HtmlForm放到Page类中。
我正在使用IFrame代替。也许我会以另一种方式使用这种技术。
感谢您的努力。
答案 1 :(得分:0)
您是否在Web服务的方法中放置了一个断点,以查看它是否实际上正在访问Web服务?
我要看的另一个选项是使用XML样式表,只使用样式表和XML Server控件转换这些数据。与使用updatepanel和为您的转换调用Web服务相比,这将减少开销。
另外,请检查以确保您正在呼叫的页面上正确设置了scriptmanager。
在您的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]
除了这些想法,我必须看到你的代码。
答案 2 :(得分: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;
}
}