问题在于,Page类并非旨在像这样进行实例化。如果启动Reflector,我们将很快看到在实例化Page类并将其作为IHttpHandler返回之后,Asp.Net内部设置了一个重要的属性。您将必须设置AppRelativeTemplateSourceDirectory。这是Control类上存在的一个属性,并且在内部设置了TemplateControlVirtualDirectory属性,Hyperlink例如使用该属性来解析链接中“〜”的正确URL。
请务必在调用LoadControl方法之前设置此值,因为AppRelativeTemplateSourceDirectory的值会传递到“主”控件创建的控件上。
如何获得正确的值来设置您的财产?在HttpRuntime类上使用静态AppDomainAppVirtualPath。总结一下,这应该起作用。
[WebMethod(EnableSession = true)]public string GetControl(int parma1, int param2){ var pageHolder = new Page() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; var viewControl = (UserControl)pageHolder.LoadControl("~/ascx/mycontrol.ascx"); var viewControlType = viewControl.GetType(); pageHolder.Controls.Add(viewControl); var output = new StringWriter(); HttpContext.Current.Server.Execute(pageHolder, output, false); return output.ToString();}


