Bezdepbonusu7Программирование: статьи и ответы

Вопрос

.Net MVC Routing Catchall не работает

Автор вопроса: Jeff KeslinkeОтветов: 4

Кажется, я не могу понять этого. Я экспериментирую с бета-версией 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" }
        );

Спасибо Джефф

routing

Ответы

Ответ 1 · рейтинг 3 · Community

Маршруты MVC проверяются в порядке их ввода.

Mysite / blah будет найден по маршруту по умолчанию. Контроллер будет blah, а действие - index.

Когда вы ввели маршрут mysite / blah / blah / blah / blah, вы указали ему маршрут, который не может сопоставить маршрут по умолчанию, и затем был вызван ваш общий маршрут.

В этих других примерах вы заметили, были ли у них настроены фильтры ошибок? Я почти уверен, что на сайте asp.net mvc по умолчанию уже есть некоторые атрибуты обработки ошибок на страницах.

Ответ 2 · рейтинг 6 · Scott

Ваш первый маршрут будет перехватывать наибольшее количество URL-адресов, так как у вас есть значения по умолчанию для элементов, вы можете визуализировать это с помощью отладчика маршрутов от Фила Хаака, см. Ссылку:

Route Debugger

Ответ 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 без этой модификации маршрута.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы