【问题标题】:Generate a URL with URL Routing in Webforms在 Web 表单中使用 URL 路由生成 URL
【发布时间】:2008-11-11 01:39:10
【问题描述】:

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

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

但是,如果您想在 Web 表单中生成 Url,该怎么办?

我还没有找到关于使用 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 没有

【问题讨论】:

    标签: c# url routing url-routing


    【解决方案1】:

    感谢您的回答。为了补充这一点,这是我所做的:

    在 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() 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
    }
    

    塔达!

    【讨论】:

    • 太好了,我正是需要这个来从控制器内部生成 URL。 :) 看来您不需要命名路由:只需将“控制器”和“操作”字符串添加到参数字典并调用 GetVirtualPath 而不使用 routeName。都一样。
    • 感谢这帮助我克服了 Response.RedirectToRoute 的问题。 forums.asp.net/t/1631283.aspx
    • @armstrongest 使用您的方法,我们可以从 URL Ex: {Title} 中删除参数,并且我在 MapPageRoute 的 routevaluedictionary 中传递 TitleId ,所以我们可以这样做?
    • @Webruster 我不是 100% 确定你在问什么,但是是的,你不需要在 URL 中使用{title},它主要用于 SEO 目的。但是您必须使参数成为可选参数或在其中创建没有它的路由。自从我使用 .Net MVC 以来已经有一段时间了,现在它已经 8 岁了,所以可能有更现代的方法来做这件事。
    【解决方案2】:

    正如您所说,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中的。

    【讨论】:

    • 没关系。我会说双语……有时我什至会说帕斯卡语。
    【解决方案3】:

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

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

    【讨论】:

    • 抱歉,我可能不太清楚。我知道如何生成超链接。我正在尝试根据我在路由表中设置的规则生成友好的 url。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2011-01-30
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多