Две вещи:
Во-первых, вы всегда должны упорядочивать свои маршруты в порядке убывания специфичности (например, сначала в наиболее конкретном случае, в последнем случае в наименее конкретном случае), чтобы маршруты «проваливались», если один из них не соответствует, он попытается выполнить следующий.
Итак, мы хотим определить {controller} / {postid} / ... (должен быть postid), прежде чем мы определим {controller} / {action} / ... (может быть что-то еще)
Далее, мы хотим иметь возможность указать, что если предоставленное значение для postid не похоже на Post ID, маршрут должен потерпеть неудачу и перейти к следующему. Мы можем сделать это, создав класс IRouteConstraint:
public class PostIDConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection)
{
//if input looks like a post id, return true.
//otherwise, false
}
}
Мы можем добавить его в определение маршрута следующим образом:
routes.MapRoute(
"Default",
"{controller}/{postid}/{description}",
new { controller = "Posts", action = "Display", id = 0 },
new { postid = new PostIDConstraint() }
);