Ограничить вложенные представления в MVC 5

Мой сайт требует маршрутов, которые выглядят примерно так:

/products/product1/subcategory
/products/product1/subcategory2
/products/product2/subcagetory
etc..

Я настроил свои маршруты:

routes.MapRoute("Product1", "products/product1/{action}" ....
routes.MapRoute("Product2", "products/product2/{action}" ....

Я делаю это для того, чтобы элементы меню перенаправлялись к правильному виду, что отлично работает, но наш тестер понял, что пользователи могут менять URL-адрес, который возвращает нерегулярные результаты, например:

/products/product1/subcategory-for-product2
/products/product2/subcategory-for-product1

Есть ли способ заблокировать это?

1 ответ

Поскольку это логика маршрутизации, вы можете создать настраиваемое ограничение, которое проверяет, относится ли подкатегория к продукту:

public class CategoryConstraint : IRouteConstraint
 {
 public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
 {
 // code to validate subcategory
 }
 }

... и используйте это ограничение в определениях маршрутов.

Проверка проверки категории относится к продукту, а если нет, не сопоставляйте ее, чтобы URL-адрес заканчивался недопустимым запросом (ресурс не найден).

При таком подходе обрабатывается каждый недействительный входящий маршрут, а также генерируется исходящие ссылки; который я считаю более чистым, чем это делают в контроллере.

Читать подробнее.

EDIT: просто нашел этот связанный вопрос.

licensed under cc by-sa 3.0 with attribution.