【问题标题】:ASP-Url Routing without MVC giving problems没有 MVC 问题的 ASP-Url 路由
【发布时间】:2012-08-28 18:23:07
【问题描述】:

我在使用 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,但这让事情变得更糟。 我没有使用任何自定义处理程序

我应该如何解决这个问题?/为什么它不能正常工作?

尝试在&lt;a href="/Categories/&lt;%# Eval("Category_Id")%&gt;/&lt;%# Eval("Category_Name")%&gt;"&gt; 之类的网址之前使用/,但它说resource not found 所以在routes.MapPageRoute("cats","/Categories/{ct}/{catname}","~/catwise.aspx"); 中添加了/
但它抛出编译时错误,说 url 不能包含 /~?

【问题讨论】:

  • 您在测试网站时的主页 URL 是什么?是http://localhost:1234 还是http://localhost:1234/mysite。如果是前者,/ 应该可以工作
  • 首页网址为http://localhost:14268/mysite
  • 这就是/ 不起作用的原因。它给出了http://localhost:14268/Categories/1/Apple 而不是正确的http://localhost:14268/mysite/Categories/1/Apple。有趣的是,在生产中会起作用......无论如何,请参阅我在下面帖子中的最后一次编辑,它应该可以解决问题。

标签: asp.net url-routing


【解决方案1】:

这不是路由问题。问题出在链接上。我不知道这是否是在网页中生成链接的更好方法,但快速解决方法是简单地添加/

<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>

See also here

【讨论】:

  • 好的,我试过了,但没用。它说resource not found,所以我添加了一个/,即使在像routes.MapPageRoute("cats","/Categories/{ct}/{catname}","~/catwise.aspx"); 这样的MapPageRoutes 方法中,但这会引发编译时错误,它说url cannot start with ~ or /。跨度>
  • @VishalRavlani 你不需要改变你的路线,这只是你生成你的 URL 的方式。
  • @james : 你能告诉我我应该怎么做吗..因为我已经搜索了 3 天的 url 重写和 url 路由但没有找到任何合适的资源所以我决定使用 url路由。这似乎很容易。但在没有文章中我找到了解决方案。这是我正在开发的第一个网站,我对路由一无所知。
  • 我确信那里有很多资源。请参阅我提到的链接。我还编辑了我的帖子,最后给出的示例应该可以正常工作。
  • @lalibi: 我试过了.. 但在我的例子中你可以看到 apple(category name) 和 1(category id) 都来自数据库。因此,当我使用数据库中的值执行此操作时,它不起作用并且错误表示请求错误,因为数据没有得到评估
【解决方案2】:

试试这个例子:

<a href="<%=Request.ApplicationPath%>/Categories/<%# Eval("Category_Id")%>/<%# Eval("Category_Name")%>">

&lt;%=Request.ApplicationPath%&gt; 应解析为指向应用程序根目录的相对路径...

【讨论】:

  • 很抱歉,我不得不接受这个作为答案,因为您的解决方案确实在本地工作,但在托管服务器上没有工作......所以我不得不使用GetRouteUrl..
  • 有趣...但是如果它不起作用你当然不应该接受它。
  • 问题是我在local 上测试它并且它运行良好,所以我接受了你的回答,我想如果它在本地运行,它也可以在托管服务器上运行..但是上传时它在托管服务器上无法正常工作...所以我不得不使用其他解决方案..抱歉造成误解。
【解决方案3】:

当您创建像 Categories/1/Apple 这样的链接时,它被视为与当前 URL 的相对链接,您需要在 URL 的开头添加反斜杠,例如/Categories/1/Apple,这可以确保您的 URL 是相对于根的。

更新

根据您的评论“主页网址是 http://localhost:14268/mysite”,您的网站似乎在虚拟目录下运行。因此,简单地将/ 添加到 URL 是行不通的,您需要明确地将 VD 的路径添加到 URL 例如

<% Request.ApplicationPath %>/Categories/...

【讨论】:

  • 当我添加/ 时,我不知道为什么,但它给出了resource not found 的错误
  • 谢谢&lt;% Request.ApplicationPath %&gt; 成功了..但我不得不接受 OP 的回答,因为他首先回答了这个解决方案....但非常感谢
  • @VishalRavlani 没问题,如果您提到该网站在 VD 下运行,我会第一次回答这个问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
相关资源
最近更新 更多