Arm*_*est 6 c# url routing url-routing
我知道在MVC框架中,你有Html类来创建URL:
Html.ActionLink("About us", "about", "home");
Run Code Online (Sandbox Code Playgroud)
但是如果你想在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);
Run Code Online (Sandbox Code Playgroud)
如何使用路由表数据生成URL.
例如./ ca / en/articles/123 /文章标题没有
谢谢你的回答.再补充一点,这就是我所做的:
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);
Run Code Online (Sandbox Code Playgroud)
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() }
};
Run Code Online (Sandbox Code Playgroud)
CleanUrl()返回URL友好名称.
VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, routeName, parameters);
string url = vpd.VirtualPath;
return url; // eg. /ca/en/1/The-Article-Title
}
Run Code Online (Sandbox Code Playgroud)
田田!
正如您所说,ASP.NET MVC 为您提供了一组帮助器方法来“反向查找”RouteTable 并为您生成 URL。我还没有玩过这么多,但据我所知,您需要在 RouteCollection(最有可能是 RouteTable.Routes)上调用 GetVirtualPath 方法。所以像这样:
Dim routedurl = RouteTable.Routes.GetVirtualPath(context, rvd).VirtualPath
Run Code Online (Sandbox Code Playgroud)
您需要传递 RequestContext 和 RouteValueDictionary。RouteValueDictionary 包含路由参数(因此在您的情况下,类似于 County="UK"、lang="EN-GB" 等。棘手的部分是 RequestContext,因为这不是正常 HttpContext 的一部分。您可以将其推入IRouteHandler 中的 HttpContext:
requestContext.HttpContext.Items("RequestContext") = requestContext
Run Code Online (Sandbox Code Playgroud)
然后在需要时在 IHttpHandler(aspx 页面)中再次恢复它:
Dim rvd =
New RouteValueDictionary(New With {.country = "UK", .lang = "EN-GB"})
Dim routedurl =
RouteTable.Routes.GetVirtualPath(context.Items("RequestContext"), rvd).VirtualPath
Run Code Online (Sandbox Code Playgroud)
很抱歉在 VB 中回答 C# 问题,只是我必须提供的 ASP.NET 路由站点是在 VB.NET 中。
| 归档时间: |
|
| 查看次数: |
5369 次 |
| 最近记录: |