使用Ajax加载用户控件

3
我正在尝试找到一种最佳实践,使用Ajax加载用户控件。
我的第一个方法是简单地使用UpdatePanel,并在ajax回发时使用LoadControl()填充它,但这将重新呈现同一UpdatePanel中加载的其他用户控件。此外,我不能有预定义的一组UpdatePanels,因为我需要加载的UserControls数量会变化。
对于这种情况,是否有任何最佳实践?
如果需要,我可以实现一个框架或某种自定义控件,如果可能的话,我希望能够使用ASP.NET 3.5和AjaxControlToolkit来完成这个任务。
3个回答

8

也许有很多高端理由不采用这种方式,但是在我的简单观点中,只需初始化页面,添加用户控件,然后执行并将结果HTML转储到任何适合您的位置,速度之快和乐趣之多(令人眼花缭乱),我必须提及...

跳过UpdatePanels,只使用标签、普通的span或者缩写...

在客户端使用JQuery:

$('#SomeContainer').Load("default.aspx?What=GimmeSomeSweetAjax");

服务器端:

if(Request.QueryString["What"]==GimmeSomeSweetAjax)
{
   Page page = new Page();
   Control control = (Control)LoadControl("~/.../someUC.ascx");
   StringWriter sw = new StringWriter();
   page.Controls.Add(control);
   Server.Execute(page, sw, false);
   Response.Write(sw.ToString());
   Response.Flush();
   Response.Close();
}

没有其他操作执行,页面的生命周期就像是真正的“科沃金时刻”一样终止了;-)


1
你必须知道,“Server.Execute”方法和通过InnerHtml插入它的方式对于带有ajax控件的用户控件是不起作用的 - 当通过InnerHtml插入时,脚本标记不会在DOM上执行。仅供参考。我自己尝试过并回到了UpdatePanels... - user264265

2

太棒了,谢谢。我一直想知道如何做到这一点,但从来没有一个好的理由花时间尝试。如果将来需要,现在我有了一些帮助。 - Jason Bunting

1

为了让属性正常工作,不得不使用这个!

        var page = new Page();
        var sw = new StringWriter();
        var control = (UserControl)page.LoadControl("~/.../someUC.ascx");

        var type = control.GetType();
        type.GetProperty("Prop1").SetValue(control, value, null);
        page.Controls.Add(control);

        context.Server.Execute(page, sw, false);
        context.Response.ContentType = "text/html";
        context.Response.Write(sw.ToString());
        context.Response.Flush();
        context.Response.Close();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接