Ответ 1
Вы можете реализовать IRouteConstraint
и использовать его в таблице маршрутов.
Реализация этого ограничения маршрута может использовать рефлексию, чтобы проверить, существует ли контроллер/действие. Если он не существует, маршрут будет пропущен. В качестве последнего маршрута в таблице маршрутов вы можете установить тот, который ловит всех и сопоставляет его с действием, которое отображает вид 404.
Вот фрагмент кода, который поможет вам начать:
public class MyRouteConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
var action = values["action"] as string;
var controller = values["controller"] as string;
var controllerFullName = string.Format("MvcApplication1.Controllers.{0}Controller", controller);
var cont = Assembly.GetExecutingAssembly().GetType(controllerFullName);
return cont != null && cont.GetMethod(action) != null;
}
}
Обратите внимание, что вам нужно использовать полностью квалифицированное имя контроллера.
RouteConfig.cs
routes.MapRoute(
"Home", // Route name
"{controller}/{action}", // URL with parameters
new { controller = "Home", action = "Index" }, // Parameter defaults
new { action = new MyRouteConstraint() } //Route constraints
);
routes.MapRoute(
"PageNotFound", // Route name
"{*catchall}", // URL with parameters
new { controller = "Home", action = "PageNotFound" } // Parameter defaults
);