Come definisco un percorso generale per un sito ASP.NET MVC?
-
03-07-2019 - |
Domanda
Ho un sito di notizie con articoli taggati in categorie.
Il mio controller si chiama " Categoria " e questo URL:
http://mysite.com/Category/Sport
passa Sport
all'azione Index
nel controller Categoria
.
Voglio consentire i seguenti URL:
http://mysite.com/Sport/Hockey
http://mysite.com/Sport/Football
http://mysite.com/Science/Evolution
Che passa tutte le informazioni sulla categoria all'azione Index
nel controller Categoria
.
Come posso creare un percorso catch-all che gestisca tutti questi e li sposti in categoria?
Soluzione
C'è una risposta abbastanza buona alla mia domanda in questo senso qui .
Altri suggerimenti
Puoi farlo in questo modo:
routes.MapRoute("Default", "{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" }
);
e quindi nel tuo controller:
public class CategoryController : Controller
{
public ActionResult Display(string category, string subcategory)
{
// do something here.
}
}
Non utilizzare alcun percorso sopra per TUTTI i percorsi (non è possibile avere una pagina Informazioni ecc. a meno che non si specifichino percorsi espliciti prima di quello sopra).
Puoi tuttavia includere un vincolo personalizzato per limitare il percorso solo alle categorie esistenti. Qualcosa del tipo:
public class OnlyExistingCategoriesConstraint : IRouteConstraint
{
public bool Match
(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
{
var category = route.DataTokens["category"];
//TODO: Look it up in your database etc
// fake that the category exists
return true;
}
}
Che usi nel tuo percorso in questo modo:
routes.MapRoute("Default",
"{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" },
new { categoryExists = new OnlyExistingCategoriesConstraint() }
);
In questo modo non interferirà con le altre rotte definite.