在ASP.NET中构造URL以避免死链接

在ASP.NET中构造URL以避免死链接,asp.net,broken-links,Asp.net,Broken Links,我正在一个中等规模的ASP.NETWebForms网站上工作。内部链接等的URL通常使用以下语法设置: <asp:HyperLink runat="server" NavigateUrl="~/Some/Path/MyPage.aspx" Text="Blah" /> NavigateUrl="<%= GetUrl(typeof(MyPage)) %>" 这让我有点紧张,因为那些链接只是字符串,我担心如果我重命名或移动一个页面,我会很难找到所有的引用 是否有某种A

我正在一个中等规模的ASP.NETWebForms网站上工作。内部链接等的URL通常使用以下语法设置:

<asp:HyperLink runat="server" NavigateUrl="~/Some/Path/MyPage.aspx" Text="Blah" />
NavigateUrl="<%= GetUrl(typeof(MyPage)) %>"

这让我有点紧张,因为那些链接只是字符串,我担心如果我重命名或移动一个页面,我会很难找到所有的引用

是否有某种ASP.NET-y方法可以在运行时确定实际路径?我正在设想这样的事情:

<asp:HyperLink runat="server" NavigateUrl="~/Some/Path/MyPage.aspx" Text="Blah" />
NavigateUrl="<%= GetUrl(typeof(MyPage)) %>"
NavigateUrl=“”

您真正想要的是像Umbraco、Sitecore、OpenText等这样的CMS

然而,您可以使用一个数据库和一个带有ID和Url列的表来完成一些工作。然后你可以做:

NavigateUrl="<%= GetUrl("AwesomeLink") %>"
NavigateUrl=“”
它可以转到数据库,查找ID并为您填写准备好的链接。它还允许您在不重新编译的情况下更改链接


它与您的想法类似,只是您仍然需要在某个时候告诉它您想要什么链接。你猜不到

您真正想要的是像Umbraco、Sitecore、OpenText等这样的CMS

然而,您可以使用一个数据库和一个带有ID和Url列的表来完成一些工作。然后你可以做:

NavigateUrl="<%= GetUrl("AwesomeLink") %>"
NavigateUrl=“”
它可以转到数据库,查找ID并为您填写准备好的链接。它还允许您在不重新编译的情况下更改链接


它与您的想法类似,只是您仍然需要在某个时候告诉它您想要什么链接。你猜不到

您可以根据文件夹结构的逻辑定义方法
GetUrl
。假设名称空间与文件夹结构相对应,基本定义如下

public string GetUrl(System.Type CurrentType)
    {
      List<string> PathInNamespace = CurrentType.FullName.Split('.').ToList<string>();
      PathInNamespace.RemoveAt(0);
      return "/" + string.Join("/", PathInNamespace.ToArray());      
    }
公共字符串GetUrl(System.Type CurrentType)
{
List PathInNamespace=CurrentType.FullName.Split('.').ToList();
PathInNamespace.RemoveAt(0);
返回“/”+string.Join(“/”,PathInNamespace.ToArray());
}

您可以根据文件夹结构的逻辑定义方法
GetUrl
。假设名称空间与文件夹结构相对应,基本定义如下

public string GetUrl(System.Type CurrentType)
    {
      List<string> PathInNamespace = CurrentType.FullName.Split('.').ToList<string>();
      PathInNamespace.RemoveAt(0);
      return "/" + string.Join("/", PathInNamespace.ToArray());      
    }
公共字符串GetUrl(System.Type CurrentType)
{
List PathInNamespace=CurrentType.FullName.Split('.').ToList();
PathInNamespace.RemoveAt(0);
返回“/”+string.Join(“/”,PathInNamespace.ToArray());
}

一个非代码解决方案是创建自定义错误页面,链接到网站的其他部分,或在所述错误页面中插入搜索框。它快速、简单,也有助于搜索引擎优化。

一个非代码解决方案是创建自定义错误页面,链接到网站的其他部分,或在所述错误页面中插入搜索框。它快速、简单,也有助于搜索引擎优化。

如果您使用的是中等大小的应用程序,则需要花费一些时间来浏览所有代码,以查看数据库表。我知道。我不是在寻找一个灵丹妙药,而是一个更好的迁移解决方案。如果您使用的是一个中等大小的应用程序,则需要花费一些时间来浏览所有代码,以查看db表。我知道。我不是在寻找一个神奇的子弹,只是一个更好的迁移解决方案。对于这些链接中的每一个,对于每一个页面调用,您都将执行一个数据库查询。一些缓存机制将有助于缓解这种情况。是的,我知道有人会带着它回来。自然,我会缓存:一个要考虑的问题是这样的解决方案,是数据库使用的后果。对于这些链接中的每一个,对于每一个页面调用,您都将执行一个数据库查询。一些缓存机制将有助于缓解这种情况。是的,我知道有人会带着它回来。当然我会缓存:)