Как определить универсальный маршрут для сайта ASP.NET MVC?
-
03-07-2019 - |
Вопрос
У меня есть новостной сайт со статьями, размеченными по категориям.
Мой контроллер называется " Категория " и этот URL:
<код> http://mysite.com/Category/Sport код>
передает Sport
в действие Index
в контроллере Category
.
Я хочу разрешить следующие URL:
<код> http://mysite.com/Sport/Hockey код>
<Код> http://mysite.com/Sport/Football код>
http://mysite.com/Science/Evolution
которая передает всю информацию о категории в действие Index
в контроллере Category
.
Как мне создать универсальный маршрут, который обрабатывает все это и переводит их в категорию?
Решение
Другие советы
Вы можете сделать это следующим образом:
routes.MapRoute("Default", "{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" }
);
а затем в вашем контроллере:
public class CategoryController : Controller
{
public ActionResult Display(string category, string subcategory)
{
// do something here.
}
}
Не делайте так, чтобы какой-либо маршрут выше был использован для ВСЕХ маршрутов (у вас не может быть страницы About и т. д., если вы не укажете явные маршруты перед вышеупомянутым).
Однако вы можете включить пользовательское ограничение, чтобы ограничить маршрут только существующими категориями. Что-то вроде:
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;
}
}
Что вы используете в своем маршруте следующим образом:
routes.MapRoute("Default",
"{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" },
new { categoryExists = new OnlyExistingCategoriesConstraint() }
);
Таким образом, он не будет мешать другим вашим заданным маршрутам.