在Webforms中生成带URL路由的URL

时间:2008-11-11 01:39:11

标签: c# url routing url-routing

我知道在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 /文章标题没有

3 个答案:

答案 0 :(得分: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);       

从文章对象

创建网址
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()returns a URL Friendly name

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

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

多田!

答案 1 :(得分:4)

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

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

您需要传递RequestContext和RouteValueDictionary。 RouteValueDictionary包含路由参数(所以在你的情况下类似于=“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中。

答案 2 :(得分:-1)

Hyperlink hl = new Hyperlink(); hl.Text =“点击这里”; hl.NavigateUrl = “〜/表格/ Article.aspx”; MostlyAnyControl.Controls.Add(HL);

将其放入列表中...(1)循环/迭代,或(2)Linq to XML。