ASP.NET页面点击导航链接时URL路径重复致404错误求助
解决ASP.NET Web Forms母版页下拉菜单路径重复导致404的问题
问题重现
项目结构:
- Views/Home/Index.aspx(引用SystemsMenu.Master母版页)
- Views/Home/MEFS/ 下存放多个aspx页面(同样引用SystemsMenu.Master)
母版页中MEFS下拉菜单的静态链接代码:
<li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="MEFSDropdown" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside">MEFS</a> <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> <li><a href="MEFS/AboutMEFS.aspx">About</a></li> <li><a href="MEFS/Documentation.aspx">Documentation</a></li> <li><a href="MEFS/MEFSAccess.aspx">Access to MEFS</a></li> <li><a href="MEFS/FAQMEFS.aspx">FAQ – Frequently asked questions</a></li> </ul> </li>
- 首次从Index.aspx点击Documentation链接,URL为
/Views/Home/MEFS/Documentation.aspx,加载正常 - 在Documentation.aspx页面再次点击FAQMEFS链接,URL变为
/Views/Home/MEFS/MEFS/FAQMEFS.aspx,触发404错误
问题原因
静态<a>标签的相对路径是基于当前页面的URL解析的:
- 在Index.aspx(路径
/Views/Home/)下,MEFS/FAQMEFS.aspx会解析为/Views/Home/MEFS/FAQMEFS.aspx,正确 - 在MEFS子页面(路径
/Views/Home/MEFS/)下,MEFS/FAQMEFS.aspx会解析为/Views/Home/MEFS/MEFS/FAQMEFS.aspx,路径重复导致找不到资源
解决方案
1. 使用ASP.NET根路径运算符~(推荐)
ASP.NET的~运算符会自动映射到应用程序的根目录,无论当前页面处于哪个层级,都能正确生成路径。修改链接为:
<li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="MEFSDropdown" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside">MEFS</a> <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> <li><a href="~/Views/Home/MEFS/AboutMEFS.aspx">About</a></li> <li><a href="~/Views/Home/MEFS/Documentation.aspx">Documentation</a></li> <li><a href="~/Views/Home/MEFS/MEFSAccess.aspx">Access to MEFS</a></li> <li><a href="~/Views/Home/MEFS/FAQMEFS.aspx">FAQ – Frequently asked questions</a></li> </ul> </li>
注意:确保页面是ASP.NET页面(.aspx),服务器会自动解析~路径。
2. 使用ASP.NET HyperLink服务器控件
用<asp:HyperLink>代替静态<a>标签,ASP.NET会自动处理路径解析,同时保持Bootstrap样式:
<li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="MEFSDropdown" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside">MEFS</a> <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> <li><asp:HyperLink runat="server" NavigateUrl="~/Views/Home/MEFS/AboutMEFS.aspx" Text="About" CssClass="dropdown-item" /></li> <li><asp:HyperLink runat="server" NavigateUrl="~/Views/Home/MEFS/Documentation.aspx" Text="Documentation" CssClass="dropdown-item" /></li> <li><asp:HyperLink runat="server" NavigateUrl="~/Views/Home/MEFS/MEFSAccess.aspx" Text="Access to MEFS" CssClass="dropdown-item" /></li> <li><asp:HyperLink runat="server" NavigateUrl="~/Views/Home/MEFS/FAQMEFS.aspx" Text="FAQ – Frequently asked questions" CssClass="dropdown-item" /></li> </ul> </li>
3. 使用绝对路径(需注意虚拟目录场景)
如果应用部署在网站根目录下,可直接使用从根开始的绝对路径:
<li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="MEFSDropdown" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside">MEFS</a> <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> <li><a href="/Views/Home/MEFS/AboutMEFS.aspx">About</a></li> <li><a href="/Views/Home/MEFS/Documentation.aspx">Documentation</a></li> <li><a href="/Views/Home/MEFS/MEFSAccess.aspx">Access to MEFS</a></li> <li><a href="/Views/Home/MEFS/FAQMEFS.aspx">FAQ – Frequently asked questions</a></li> </ul> </li>
⚠️ 注意:若应用部署在IIS虚拟目录下(如http://example.com/MyApp/),绝对路径会指向网站根而非应用根,这种场景优先用~路径。
内容的提问来源于stack exchange,提问作者Foxy
相关产品推荐
相关产品推荐

