Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Webforms中使用URL路由生成URL_C#_Url_Routing_Url Routing - Fatal编程技术网

C# 在Webforms中使用URL路由生成URL

C# 在Webforms中使用URL路由生成URL,c#,url,routing,url-routing,C#,Url,Routing,Url Routing,我知道在MVC框架中,您有Html类来创建URL: Html.ActionLink("About us", "about", "home"); 但是如果您想在Webforms中生成URL呢 关于使用Webforms生成URL的详细信息,我还没有找到真正好的资源 例如,如果我正在生成这样的路由: Route r = new Route("{country}/{lang}/articles/{id}/{title}",

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

Html.ActionLink("About us", "about", "home");
但是如果您想在Webforms中生成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/不带超链接的文章标题hl=新超链接(); hl.Text=“单击此处”; hl.NavigateUrl=“~/Forms/Article.aspx”; 大多数控件。控件。添加(hl)


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

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

谢谢你的回答。为了补充这一点,我做了以下工作:

在Global.asax中 从文章对象创建Url CleanUrl()


TaDa!

对不起,也许我不清楚。我知道如何生成超链接。我正在尝试根据我在路由表中设置的规则生成友好的URL。没关系。我会双语……有时我甚至会说帕斯卡语。太好了,我需要这个来从内部控制器生成URL。:)您似乎也不需要命名路由:只需向参数字典添加一个“控制器”和一个“操作”字符串,并在不使用routeName的情况下调用GetVirtualPath。同样有效。谢谢,这帮助我克服了Response.RedirectToRoute的问题@使用您的方法,我们可以从URL
中删除参数吗?例如:
{Title}
,我正在传递
Title
Id
,在
MapPageRoute
中的routevaluedictionary中,所以我们可以这样做吗?@Webruster我不是100%确定您在问什么,但是的,您不需要
{Title}
在URL中,它主要用于SEO目的。但是您必须将参数设置为可选的,或者创建一个不包含该参数的路由。我已经有一段时间没有使用.NETMVC了,现在已经8岁了,所以可能有更现代的方法来实现这一点。
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() } 
        }; 
    VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, routeName, parameters);

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