1

Ich habe auf Benutzeranfragen von URLs wie geben:ASP .NET Core: Routing. Verschiedene Kategorien in url auf Anfang

site.com/events/2017/06/wwdc.html 

oder häufiger:

site.com/category1/subcategory1/subcategory2/...../subcategoryN/page-title.html 

z.B.

site.com/cars/tesla/model-s/is-it-worth-it.html 

zu ArticlesController mit Wirkung Index(string title) oder so ähnlich.

Zur Kompilierzeit weiß ich nicht, wie viele Segmente ich haben werde. Aber ich weiß, dass URLs mit /{pageTitle}.html enden. Das Hauptproblem ist, dass das default asp.net Core Routing es mir nicht erlaubt, etwas zu schreiben wie {*}/pageTitle.html

Ist es möglich?

Antwort

2

Es ist möglich, und Sie hätten es fast getan.

Die Strecke ist

 app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "all", 
       template: "{*query}", 
       defaults: new 
       { 
        controller = "Index", 
        action = "ArticlesController" 
       }); 
     }); 

EDIT: template: "{*query:regex(.+/.+\\.html$)}" wird sichergestellt, dass mindestens eine Kategorie angegeben ist und dass der Titel endet mit .html

und in der Aktion des Controllers:

public IActionResult Index(string query) 
    { 
     string[] queryParts = query.Split(new char[] { '/' }); 
     string title = queryParts[queryParts.Length - 1]; 
     string[] categories = queryParts.Take(queryParts.Length - 1).ToArray(); 

     // add your logic about the title and the categories 

     return View(); 
    } 

Siehe die documentation:

Dedizierte konventionelle Routen verwenden häufig die Parameter für die Catch-all-Route wie {* article}, um den verbleibenden Teil des URL-Pfads zu erfassen. Diese kann eine Route "zu gierig" machen, was bedeutet, dass sie mit URLs übereinstimmt, die Sie mit anderen Routen verbinden möchten, die Sie haben. Setzen Sie die "gierigen" Routen später in die Routentabelle, um dies zu lösen.

+0

die Route alle Anfragen fangen, nicht nur Dinge wie 'Kategorie/title.html' Das einzige, was mir helfen kann, diese Regel am Ende gesetzt wird ... Dank – mokeev1995

+1

Diese Strecke Ort sein muss das Ende, richtig. Sie können Dinge wie 'category/title.html' filtern, indem Sie einen regulären Ausdruck im Filter anwenden. 'template:" {* query: regex (. + /. + \\. html $)} ",' funktioniert perfekt für Ihre Bedürfnisse;) (Sie können auch meine Antwort verbessern, wenn es gut funktioniert :-p) –

+0

I kann nicht, ich habe keinen Ruf genug ... – mokeev1995

Verwandte Themen