【发布时间】:2010-06-30 16:08:38
【问题描述】:
我创建了一个用户控件、一个 web 服务和一个 web 方法来返回控件的渲染 html,通过 jQuery 执行 ajax 调用。
一切正常,但是如果我在使用相对路径的用户控件中放置一些东西(在我的例子中是带有 NavigateUrl="~/mypage.aspx" 的超链接),则相对路径的解析在我的开发服务器中失败。
我期待: http://localhost:999/MyApp/mypage.aspx
但我得到: http://localhost:999/mypage.aspx
缺少“我的应用”...
我认为问题在于用于加载控件的页面的创建:
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
现在我会这样做,但我会明白为什么它不能以正常方式工作。 有什么想法吗?
【问题讨论】:
-
您在页面/控件生命周期的哪个位置调用
hl.NavigateUrl = Page.ResolveUrl("~/mypage.aspx")?在执行此操作之前,您是否只是在代码中的同一位置运行hl.NavigateUrl = "~/mypage.aspx"?
标签: asp.net ajax user-controls relative-path