用于AJAX调用的Asp.Net单一控件呈现
我正在尝试实现类似于
this或
this的东西.
我创建了一个用户控件,一个Web服务和一个Web方法来返回控件的渲染html,通过jQuery执行ajax调用. 一切正常,但如果我在使用相对路径的用户控件中放置一些东西(在我的情况下是一个带有NavigateUrl =“?/ mypage.aspx”的HyperLink),相对路径的分辨率在我的开发服务器中失败. 我期待着: 但我得到: 缺少’MyApp’…… 我认为问题在于创建用于加载控件的页面: Page page = new Page(); Control control = page.LoadControl(userControlVirtualPath); page.Controls.Add(control); ... 但我无法弄清楚为什么…… 编辑 我的用户控件位于?/ ascx / mycontrol.ascx 然后我编写了一个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的开发服务器执行项目时,我的应用程序的根是 http://localhost:999/MyApp/ 它很好,但NavigateUrl被解析为 http://localhost:999/mypage.aspx 失去/ MyApp /. 另一件奇怪的事情是,如果我设置了hl.NavigateUrl = Page.ResolveUrl(“?/ mypage.aspx”),我会得到正确的页面网址: 到现在为止,我会这样做,但我会理解为什么它不能正常工作.
问题是Page-class并不打算像那样实例化.如果我们启动Reflector,我们很快就会发现Asp.Net内部在实例化一个Page类并将其作为IHttpHandler返回后设置了一个重要的属性.您必须设置AppRelativeTemplateSourceDirectory.这是一个存在于Control类上的属性,并在内部设置TemplateControlVirtualDirectory属性,例如HyperLink用于解析链接中“?”的正确URL.
在调用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(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |