我的网站上有一个页面,为了这个例子,我们可以说http://myhost/Pages/Default.aspx。在Default.aspx上,我有一个名为MyControl.ascx的用户控件,它位于/Controls/MyControl.ascx中。所以树看起来像这样
每当我在MyControl.ascx上放置HyperLink控件并指定NavigateUrl时,此路径都是相对于控件而不是页面的URL。因此,例如,如果在NavigateUrl中我指定了“AboutMe.aspx”,则URL将呈现为http://myhost/Controls/AboutMe.aspx而不是http://myhost/Pages/AboutMe.aspx。我有什么方法可以使这个相对于页面URL?我在这里尝试了解决方案:Relative path from an ASP.NET user control NavigateUrl但它对我不起作用。
修改
为了澄清,我希望这是足够通用的,以便如果我不知道路径是什么,解决方案将起作用。所以我真的不想在NavigateUrl中编码“〜/ Pages / Default.aspx”
答案 0 :(得分:5)
你有很多选择:
您可以使用~
运算符对Url进行硬编码,该运算符为您提供根,然后从那里对其进行定义,如:~/Pages/AboutMe.aspx
。请记住,~
运算符仅被识别为服务器控件和服务器代码。
您还可以使用..
将您带到所需的位置,因为它会导航回文件夹结构,如:../Pages/AboutMe.aspx
您可以创建一个辅助方法,将有效的根返回到Pages文件夹,图像,Javascript等......
HttpRequest.ApplicationPath
将获取您可用于构建的服务器上的虚拟应用程序的根路径。
有关Pathing选项的更多信息,请阅读MSDN上的这篇文章:
编辑:根据您对问题的修改,您应该通过属性将相对URL传递给您的用户控件。让使用该控件的页面定义它将需要的资源的相对路径。
答案 1 :(得分:2)
实现这一目标的最佳方法是使用
string.Format("{0}", Page.Request.Url.PathAndQuery);
NavigateUrl属性中的
答案 2 :(得分:1)
以防万一其他人偶然发现这件事......
在后面的代码中,我将NavigateUrl设置为:
link.NavigateUrl = Page.ResolveUrl("aboutus.aspx");
答案 3 :(得分:0)
如何设置超链接的NavigateUrl?如果我使用~
字符设置它,那么它按预期工作:
MyControl.ascx
<asp:HyperLink runat="server" NavigateUrl="~/Pages/Default.aspx" ... >
答案 4 :(得分:0)
比这更简单。只需将usercontrol的AppRelativeTemplateSourceDirectory属性更改为父页面的相同属性的值。
protected override void OnInit(EventArgs e)
{
AppRelativeTemplateSourceDirectory = Page.AppRelativeTemplateSourceDirectory;
base.OnInit(e);
}
然后用户控制中的所有相对路径都将在页面中。