我创建了一个用户控件,一个Web服务和一个Web方法来返回控件的渲染html,通过jQuery执行ajax调用.
一切正常,但如果我在使用相对路径的用户控件中放置一些东西(在我的情况下是一个带有NavigateUrl =“〜/ mypage.aspx”的HyperLink),相对路径的分辨率在我的开发服务器中失败.
我期待着:
http://localhost:999/MyApp/mypage.aspx
但我得到:
http://localhost:999/mypage.aspx
缺少’MyApp’……
我认为问题在于创建用于加载控件的页面:
Page page = new Page(); Control control = page.LoadControl(userControlVirtualPath); page.Controls.Add(control); ...
但我无法弄清楚为什么……
编辑
为了清楚起见
我的用户控件位于〜/ ascx / mycontrol.ascx
并包含一个非常简单的结构:现在只是一个带有NavigateUrl的超链接,如“〜/ mypage.aspx”.
并且“mypage.aspx”确实存在于根目录中.
然后我编写了一个Web服务来返回ajax部分渲染控件:
[ScriptService] [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class wsAsynch : System.Web.Services.WebService { [WebMethod(EnableSession = true)] public string GetControl(int parma1,int param2) { /* ...do some stuff with params... */ Page pageHolder = new Page(); UserControl viewControl = (UserControl)pageHolder.LoadControl("~/ascx/mycontrol.ascx"); Type viewControlType = viewControl.GetType(); /* ...set control properties with reflection... */ pageHolder.Controls.Add(viewControl); StringWriter output = new StringWriter(); HttpContext.Current.Server.Execute(pageHolder,output,false); return output.ToString(); } }
html被正确呈现,但是超链接的NavigateUrl中的相对路径被错误地解析,因为当我从VS2008的开发服务器执行项目时,我的应用程序的根是
它很好,但NavigateUrl被解析为
http://localhost:999/mypage.aspx
失去/ MyApp /.
当然,如果我把ascx放在一个真实的页面中,而不是在ws中使用的pageHolder实例,一切正常.
另一件奇怪的事情是,如果我设置了hl.NavigateUrl = Page.ResolveUrl(“〜/ mypage.aspx”),我会得到正确的页面网址:
http://localhost:999/MyApp/mypage.aspx
到现在为止,我会这样做,但我会理解为什么它不能正常工作.
任何想法?
在调用LoadControl方法之前设置此值非常重要,因为AppRelativeTemplateSourceDirectory的值会传递给“master”控件创建的控件.
如何获得在您的财产上设置的正确值?在HttpRuntime类上使用静态AppDomainAppVirtualPath.嘿,总结一下……这应该有用;
[WebMethod(EnableSession = true)] public string GetControl(int parma1,int param2) { /* ...do some stuff with params... */ var pageHolder = new Page() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; var viewControl = (UserControl)pageHolder.LoadControl("~/ascx/mycontrol.ascx"); var viewControlType = viewControl.GetType(); /* ...set control properties with reflection... */ pageHolder.Controls.Add(viewControl); var output = new StringWriter(); HttpContext.Current.Server.Execute(pageHolder,false); return output.ToString(); }