ASP.NET页面加载用户控件方法

<!--------------- Page加载用户控件方法一 -------------------------->
<uc2:TrailHistoryControl ID="TrailHistoryControl1" runat="server" />

<!--------------- Page加载用户控件方法二 -------------------------->
<%
   Page page = new Page();
   Control control = page.LoadControl("~/UserControl/ContractProductNoEdit.ascx");
   Type type = control.GetType();
   type.GetProperty("Pgid").SetValue(control, s.ProductGroupCode);
   type.GetProperty("ConModel").SetValue(control, contractInfos);
   page.Controls.Add(control);
   System.IO.StringWriter writer = new System.IO.StringWriter();
   Server.Execute(page, writer, true);
%>
<%=writer.ToString() %>

<!--------------- Page加载用户控件方法三 -------------------------->
<%Hashtable parameter = new Hashtable();
   parameter.Add("Projectid", s.PageID);
   parameter.Add("Type", "edit");
   parameter.Add("UserCode", this.CurrentUserCode);
   parameter.Add("DtProductGroup", this.DtProductGroup);
   parameter.Add("BoSaveType", this.bosaveType.ToString());
   parameter.Add("BOReadOnly", this.BOReadOnly);
%>
<%=Page.LoadControl("~/UserControl/BOProjectInfoControl.ascx",parameter) %>

以下是一段参考资料:
有二种方法可以让我们继续使用页面模板代码的方式生成HTML代码:
1. Server.Execute()方法。
2. Page.RenderControl()方法。

下面这段代码来源于 MyMVC框架, 这个方法可以根据指定的用户控件以及控件显示所需的数据得到控件的输出结果(一段HTML代码)。

/// <summary>
/// 用指定的用户控件以及视图数据呈现结果,最后返回生成的HTML代码。
/// 用户控件应从MyUserControlView<T>继承
/// </summary>
/// <param name="ucVirtualPath">用户控件的虚拟路径</param>
/// <param name="model">视图数据</param>
/// <returns>生成的HTML代码</returns>
public static string Render(string ucVirtualPath, object model)
{
    if( string.IsNullOrEmpty(ucVirtualPath) )
        throw new ArgumentNullException("ucVirtualPath");
    
    Page page = new Page();
    Control ctl = page.LoadControl(ucVirtualPath);
    if( ctl == null )
        throw new InvalidOperationException(
            string.Format("指定的用户控件 {0} 没有找到。", ucVirtualPath));

    if( model != null ) {
        MyBaseUserControl myctl = ctl as MyBaseUserControl;
        if( myctl != null )
            myctl.SetModel(model);
    }

    // 将用户控件放在Page容器中。
    page.Controls.Add(ctl);

    StringWriter output = new StringWriter();
    HtmlTextWriter write = new HtmlTextWriter(output, string.Empty);
    page.RenderControl(write);

    // 用下面的方法也可以的。
    //HttpContext.Current.Server.Execute(page, output, false);

    return output.ToString();
}

整段代码分为以下几个步骤(我已用空行分隔开了):
1. 检查参数。
2. 创建页面容器并加载用户控件。
3. 设置页面(视图)所需的显示数据。
4. 将用户控件添加到Page的Controls集合中。
5. 调用RenderControl或者Execute让Page输出HTML代码。
6. 返回结果。

这段代码很简单,唯独值得介绍的就是第5步,调用它们就可以得到控件输出的HTML代码。
RenderControl或者Execute的差别在于:
RenderControl不支持服务器控件,原因在于它利用了页面的一种独特编译方式,我已在以前的博客中分析过了。
Execute可以支持服务器控件,因为它会执行一次完整的页面生命周期。

注意:上面这段代码就算使用Execute,也只能支持部分简单的服务器控件,因为一些复杂的服务器控件需要在HtmlForm中才能运行。 因此,如果需要支持所有的服务器控件,那么还必须创建HtmlForm对象,并调整包含关系,还有就是还需要去掉产生的多余HTML代码。

如果你需要生成整个页面生成的HTML代码,可以参考 MyMVC框架, 那里有实现这个功能的完整代码。

转自:http://www.cnblogs.com/fish-li/archive/2012/06/10/2544087.html

posted @ 2018-10-08 16:11  skybirdzw  阅读(665)  评论(0编辑  收藏  举报