6

我知道在 MVC 框架中,你有 Html 类来创建 URL:

Html.ActionLink("About us", "about", "home");

但是如果你想在 Webforms 中生成 Urls 怎么办?

关于使用 Webforms 生成 URL 的详细信息,我还没有找到一个非常好的资源。

例如,如果我生成这样的路线:

Route r = new Route("{country}/{lang}/articles/{id}/{title}",
                  new ArticleRouteHandler("~/Forms/Article.aspx"));
Route r2 = new Route("{country}/{lang}/articles/",
                  new ArticleRouteHandler("~/Forms/ArticlesList.aspx"));

Routes.Add(r);
Routes.Add(r2);

我将如何使用路由表数据生成 URL。

如何根据我的路由生成 URL?

例如。/ca/en/articles/123/Article-Title 没有

4

3 回答 3

7

感谢您的回答。除此之外,这是我所做的:

在 Global.asax

RouteValueDictionary rvdSiteDefaults 
    = new RouteValueDictionary { { "country", "ca" }, { "lang", "en" } };

Route oneArticle 
    = new Route("{country}/{lang}/articles/a{id}/{title}",
        rvdSiteDefaults,
        rvdConstrainID,
        new ArticleRouteHandler("~/Articles/Details.aspx"));

Routes.Add( "Article", oneArticle);       

从文章对象创建 URL

public static string CreateUrl(Article a) {
    // Note, Article comes from Database, has properties of ArticleID, Title, etc.
    RouteValueDictionary parameters;

    string routeName = "Article"; // Set in Global.asax

    parameters 
      = new RouteValueDictionary { 
         { "id", a.ArticleID }, 
         { "title", a.Title.CleanUrl() } 
        }; 

CleanUrl()返回一个 URL 友好名称

    VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, routeName, parameters);

    string url = vpd.VirtualPath; 
    return url; // eg. /ca/en/1/The-Article-Title
}

达达!

于 2008-11-13T00:02:49.170 回答
4

正如您所说,ASP.NET MVC 为您提供了一组帮助方法来“反向查找”RouteTable 并为您生成 URL。我还没有玩过这么多,但据我所知,您需要在 RouteCollection(很可能是 RouteTable.Routes)上调用 GetVirtualPath 方法。所以像:

Dim routedurl = RouteTable.Routes.GetVirtualPath(context, rvd).VirtualPath

您需要传递 RequestContext 和 RouteValueDictionary。RouteValueDictionary 包含路由参数(因此在您的情况下,类似于county="UK"、lang="EN-GB" 等。棘手的部分是RequestContext,因为这不是普通HttpContext 的一部分。您可以将其推送到IRouteHandler 中的 HttpContext:

requestContext.HttpContext.Items("RequestContext") = requestContext

然后在需要时在您的 IHttpHandler(aspx 页面)中再次恢复它:

Dim rvd = 
  New RouteValueDictionary(New With {.country = "UK", .lang = "EN-GB"})
Dim routedurl = 
  RouteTable.Routes.GetVirtualPath(context.Items("RequestContext"), rvd).VirtualPath

很抱歉在 VB 中回答了一个 C# 问题,只是我必须提供的 ASP.NET 路由站点是在 VB.NET 中的。

于 2008-11-11T16:14:27.383 回答
-1

超链接 hl = new Hyperlink(); hl.Text = "点击这里"; hl.NavigateUrl="~/Forms/Article.aspx"; 主要是AnyControl.Controls.Add(hl);

至于把它放在一个列表中......要么(1)循环/迭代,要么(2)Linq to XML。

于 2008-11-11T04:12:07.000 回答