以编程方式呈现Web UserControl

时间:2011-11-11 00:51:31

标签: c# asp.net user-controls

我在他们自己的小项目中加载了UserControl个对象(ascx个文件)。然后我在两个项目中引用这个项目:REST API(它是一个类库项目)和主要网站。

我确信这在网站上很容易,只需在任何Controls.Add中使用Panel或ASP.NET控件都可以。

然而,API怎么样?有没有什么办法可以简单地通过了解控件的类型来呈现此控件的HTML?由于控件的生命周期尚未开始,RenderControl方法不会向编写器写入任何HTML。

请记住,我没有Web项目中的控件,因此我没有ascx文件的虚拟路径。因此,LoadControl方法在此无法使用。

所有控件实际上都来自同一个基本控件。我可以在这个基类中做些什么来允许我从一个全新的实例加载控件吗?

1 个答案:

答案 0 :(得分:8)

这是我最近所做的,效果很好,但是如果你在ASP.NET应用程序中使用它,那么理解回发将不起作用。

 [WebMethod]
 public static string GetMyUserControlHtml()
 {
     return  RenderUserControl("Com.YourNameSpace.UI", "YourControlName");
 }

 public static string RenderUserControl(string assembly,
             string controlName)
 {
        FormlessPage pageHolder = 
                new FormlessPage() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; //allow for "~/" paths to resolve

        dynamic control = null;

        //assembly = "Com.YourNameSpace.UI"; //example
        //controlName = "YourCustomControl"
        string fullyQaulifiedAssemblyPath = string.Format("{0}.{1},{0}", assembly, controlName);

        Type type = Type.GetType(fullyQaulifiedAssemblyPath);
        if (type != null)
        {
            control = pageHolder.LoadControl(type, null);
            control.Bla1 = "test"; //bypass compile time checks on property setters if needed
            control.Blas2 = true;

        }                          

        pageHolder.Controls.Add(control);
        StringWriter output = new StringWriter();
        HttpContext.Current.Server.Execute(pageHolder, output, false);
        return output.ToString();
 }


public class FormlessPage : Page
{
    public override void VerifyRenderingInServerForm(Control control)
    {
    }
}