以编程方式呈现Web UserControl

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

我确信在网站上这很简单,只需在任何Panel或ASP.NET Controls.Add中使用Controls.Add即可。

但是,API怎么样? 有没有什么办法可以简单地通过了解控件的类型来呈现此控件的HTML? RenderControl方法不会向writer写入任何HTML,因为控件的生命周期甚至还没有开始。

请记住,我没有web项目中的控件,所以我没有ascx文件的虚拟路径。 所以LoadControl方法在这里不起作用。

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

这是我最近所做的,效果很好,但是如果你在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) { } } 

这应该工作。 您可以创建该类型的控件并使用您自己的HtmlTextWriter