Кажется, я не могу понять этого. Я экспериментирую с бета-версией MVC и пытаюсь реализовать общий маршрут, чтобы, если пользователь вводит mysite.com/blah вместо mysite.com/home/index, он попадет в маршрут "Ошибка".
К сожалению, кажется, что маршрут "По умолчанию" всегда первым ловит "бла". Фактически, единственный маршрут, которым я смог добраться до маршрута "Ошибка", - это бла / бла / бла / бла.
Это так, как он должен работать, потому что я видел другие примеры, в которых маршруты "По умолчанию" и "Ошибка" настроены точно так же, и кажется, что если бы они вводили контроллер, которого не существует, он попадет в маршрут "Ошибка".
Есть ли что-то, чего мне не хватает (очень возможно), или мне просто нужно будет создать определенный маршрут для каждого контроллера?
Код, который я использую:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
routes.MapRoute(
"Error",
"{*catchall}",
new { controller = "Base", action = "Error", id = "404" }
);
Спасибо Джефф
Ответ 1 · рейтинг 3 · Community
Маршруты MVC проверяются в порядке их ввода.
Mysite / blah будет найден по маршруту по умолчанию. Контроллер будет blah, а действие - index.
Когда вы ввели маршрут mysite / blah / blah / blah / blah, вы указали ему маршрут, который не может сопоставить маршрут по умолчанию, и затем был вызван ваш общий маршрут.
В этих других примерах вы заметили, были ли у них настроены фильтры ошибок? Я почти уверен, что на сайте asp.net mvc по умолчанию уже есть некоторые атрибуты обработки ошибок на страницах.
Ответ 3 · рейтинг 6 · Darin Dimitrov
Для обработки ошибок я использовал событие Application_Error в одном из своих проектов:
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
HttpException httpException = exception as HttpException;
if (httpException != null)
{
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "HttpError500");
if (httpException.GetHttpCode() == 404)
{
routeData.Values["action"] = "HttpError404";
}
Server.ClearError();
Response.Clear();
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
}
Ответ 4 · Chris Moschini
Это также может помочь при решении общих проблем MVC:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{*id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
То есть там, где написано {id}, измените его на {*id}. Это позволяет последнему параметру id использовать столько дополнительных путей, сколько может быть передано. Правило по умолчанию принимает это:
/ человек / имя / джо
Но не это:
/ продукты / список / сортировка / имя
Второй URL-адрес выбросит 404 без этой модификации маршрута.