Wie definiere ich einen allumfassenden Weg für eine Website ASP.NET MVC?
-
03-07-2019 - |
Frage
Ich habe eine Nachrichten-Website mit Artikeln in Kategorien markiert.
Meine Controller "Kategorie" genannt und diese URL:
http://mysite.com/Category/Sport
geht Sport
zum Handeln Index
in Controller Category
.
Ich möchte die folgenden URLs ermöglichen:
http://mysite.com/Sport/Hockey
http://mysite.com/Sport/Football
http://mysite.com/Science/Evolution
Welche leitet alle Kategorie Informationen zur Aktion Index
in Controller Category
.
Wie erstelle ich eine Catch-all-Route, die alle diese Griffe und pendelt sie zur Kategorie?
Lösung
Es ist eine ziemlich gute Antwort auf meine Frage an diesen Linien a href <= "https://stackoverflow.com/questions/19941/aspnet-mvc-catch-exception-when-non-existant-controller-is-requested „> hier .
Andere Tipps
Sie können es tun, wie folgt:
routes.MapRoute("Default", "{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" }
);
und dann in Ihrem Controller:
public class CategoryController : Controller
{
public ActionResult Display(string category, string subcategory)
{
// do something here.
}
}
Sie nicht, dass jeder die Strecke für alle Routen verwendet werden oben (man kann nicht eine haben Über-Seite usw., es sei denn Sie explizite Routen vor über einem angeben).
Sie können jedoch eine benutzerdefinierte Einschränkung umfassen die Route nur bestehende Kategorien zu begrenzen. So etwas wie:
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;
}
}
, die Sie in Ihre Route wie folgt aus:
routes.MapRoute("Default",
"{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" },
new { categoryExists = new OnlyExistingCategoriesConstraint() }
);
Auf diese Weise wird es nicht mit dem anderen definierten Routen stören.