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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top