我遇到了asp 4.0路由问题。
我在Global.cs中有方法
void RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("cats","Categories/{ct}/{catname}","~/catwise.aspx");
}
和
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
并在我的母版页上
<a href="Categories/<%# Eval("Category_Id")%>/<%# Eval("Category_Name")%>">
这在Categories/1/Apple
这样的第一次路由中运行良好,但现在首次路由后,所有链接都是Categories/1/Apple/Categories/2/Banana
的双重路由页面。
链接相互攀爬,因此页面显示Resource not found
我尝试设置Base
,但事情变得更糟。
我没有使用任何自定义处理程序
我该如何解决这个问题?/为什么它不能正常工作?
尝试在/
之前使用<a href="/Categories/<%# Eval("Category_Id")%>/<%# Eval("Category_Name")%>">
,但是resource not found
说/
已添加routes.MapPageRoute("cats","/Categories/{ct}/{catname}","~/catwise.aspx");
/
但是它引发了编译时错误,说url无法跟踪~
或?
或{{1}}。
答案 0 :(得分:0)
这不是路由问题。问题在于链接。我不知道这是否是在网页中生成链接的更好方法,但快速修复只需添加/
:
<a href="/Categories/<%# Eval("Category_Id")%>/<%# Eval("Category_Name")%>">
编辑:
当您在主页http://mysite/
并且浏览器看到Categories/1/Apple
之类的“相对”链接时,它会将其添加到当前路径,因此结果为http://mysite/Categories/1/Apple
。由于您的链接是相对于网页的,因此下次您点击该链接时,浏览器会再次添加该链接,并且您有http://mysite/Categories/1/Apple/Categories/1/Apple
。我提出的快速解决方案是通过添加前导/
来将您的相对链接更改为绝对。
整个问题与asp.net及其路由无关。它是关于浏览器如何处理相对链接。我认为有更多正确的方法可以生成链接(使用路由时),例如:
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl="<%$RouteUrl:ct=1,catname=Apples,routename=cats%>">
Link Text
</asp:HyperLink>
在数据绑定方案中,您可以尝试:
<asp:HyperLink ID="HyperLinkClient" runat="server"
NavigateUrl='<%# GetRouteUrl("cats", new {ct = Eval("Category_Id"), catname = Eval("Category_Name")}) %>'>
Link Text
</asp:HyperLink>
答案 1 :(得分:0)
当您创建Categories/1/Apple
之类的链接时,它会被视为当前网址的相对内容,您需要添加一个反斜杠作为网址的开头,例如/Categories/1/Apple
,这可确保您的网址与根网址相关。
<强>更新强>
根据您的评论“主页网址为http://localhost:14268/mysite
”,您的网站似乎在虚拟目录下运行。因此,简单地将/
添加到URL将无法正常工作,您需要明确地将VD的路径添加到URL中,例如。
<% Request.ApplicationPath %>/Categories/...
答案 2 :(得分:0)
试试这个例子:
<a href="<%=Request.ApplicationPath%>/Categories/<%# Eval("Category_Id")%>/<%# Eval("Category_Name")%>">
<%=Request.ApplicationPath%>
应解析为指向应用程序根目录的相对路径...