Générer une URL avec le routage d'URL dans les formulaires Web
-
07-07-2019 - |
Question
Je sais que dans le framework MVC, vous avez la classe HTML pour créer des URL:
Html.ActionLink("About us", "about", "home");
Mais que se passe-t-il si vous souhaitez générer des URL dans des formulaires Web?
Je n'ai pas trouvé de très bonne ressource sur les détails de la génération d'URL avec Webforms.
Par exemple, si je génère des itinéraires tels que:
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);
Comment puis-je générer des URL à l'aide des données de la table de routage.
Comment générer des URL en fonction de mes routes?
par exemple. / ca / ??fr / articles / 123 / Titre de l'article sans
La solution
Comme vous le dites, ASP.NET MVC vous propose un ensemble de méthodes d’aide pour "inverser la recherche". la RouteTable et générer une URL pour vous. Je n'ai pas encore beaucoup joué avec, mais d'après ce que je vois, vous devez appeler la méthode GetVirtualPath sur une RouteCollection (probablement RouteTable.Routes). Donc, quelque chose comme:
Dim routedurl = RouteTable.Routes.GetVirtualPath(context, rvd).VirtualPath
Vous devez transmettre le RequestContext et un RouteValueDictionary. RouteValueDictionary contient les paramètres de route (donc dans votre cas quelque chose comme county = "UK", lang = "EN-GB", etc. La partie délicate est le RequestContext car il ne fait pas partie du HttpContext normal. Vous pouvez le pousser dans le HttpContext dans votre IRouteHandler:
requestContext.HttpContext.Items("RequestContext") = requestContext
puis restaurez-le à nouveau dans votre IHttpHandler (page aspx) si nécessaire:
Dim rvd =
New RouteValueDictionary(New With {.country = "UK", .lang = "EN-GB"})
Dim routedurl =
RouteTable.Routes.GetVirtualPath(context.Items("RequestContext"), rvd).VirtualPath
Toutes mes excuses pour avoir répondu à une question C # dans VB. Le site de routage ASP.NET que j’avais sous la main était en VB.NET.
Autres conseils
Merci pour les réponses. Pour ajouter à cela, voici ce que j'ai fait:
Dans 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);
Créer une URL à partir d'un objet Article
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 () renvoie un Nom convivial URL .
VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, routeName, parameters);
string url = vpd.VirtualPath;
return url; // eg. /ca/en/1/The-Article-Title
}
TaDa!
Hyperlien hl = nouveau Hyperlien (); hl.Text = "cliquez ici" ;; hl.NavigateUrl = " ~ / Forms / Article.aspx " ;; MostlyAnyControl.Controls.Add (hl);
comme pour le mettre dans une liste ... soit (1) boucle / itérer, soit (2) Linq en XML.